将复杂查询转换为 linq
Translate complex query to linq
我正在尝试将以下查询与 Entity framework 结合使用,这就是我尝试使用 linq 的原因。
SELECT DISTINCT
elt.Type,
( SELECT TOP 1 Value
from ELD
where ELDTID = 2 AND ELID = el.ELID
) ID,
( SELECT TOP 1 Value
from ELD
Where ELDTID = 1 AND ELID = el.ELID
) Company,
( SELECT TOP 1 Value
from ELD
Where ELDTID = 5 AND ELID = el.EventLogID
) Message,
( SELECT Max(ET)
FROM EL el
INNER JOIN ELD eld ON eld.ELID = el.ELTID
WHERE el.ELID = el.ELID
) ET
FROM EL el
INNER JOIN ITS.ELT elt ON elt.ELTID = el.ELTID
WHERE ELSID = 3
试试这个,也许你需要
(from el in _context.EL.Where(p=>p.ELSID == 3)
join elt from _context.ELT on elt.ELTID equals el.ELTID
let ID = el.ELD.Where(p=>p.ELDTID == 2 ).Select(p=>p.Value).FirstOrDefault()
let Company = el.ELD.Where(p=>p.ELDTID == 1 ).Select(p=>p.Value).FirstOrDefault()
let Message = el.ELD.Where(p=>p.ELDTID == 5 && p.ELID = el.EventLogID).Select(p=>p.Value).Max()
let ET = el.Select(p=>p.ET).MAX()
select new
{
elt.Type,
ID,
Company,
Message,
ET
}).ToList();
假设 ELT,从示例中看不出 ELSID
是 EL 还是 ELT 属性。
我认为在您的 ET 子查询中发现了一个错误:where el.ELID = el.ELID
。您可能想在一侧引用外部查询中的 el,但不能,因为您使用的是相同的名称。在此答案中对子查询 EL.
使用 el1
尝试创建一个匹配的数据模型(下次请提供给我们一个,因为您可能已经有了)。
public class Elt
{
public int ELTID;
public int ELSID;
public int Type;
}
public class El
{
public int ELID;
public int ELTID;
public int EventLogID;
}
public class Eld
{
public int ELDTID;
public int ELID;
public int ET;
public int Value;
}
public class Db
{
public IQueryable<El> Els;
public IQueryable<Elt> Elts;
public IQueryable<Eld> Elds;
}
你的 SQL 那么应该对应这个查询:
from el in db.Els
join elt in db.Elts on el.ELTID equals elt.ELTID
where elt.ELSID == 3
select new
{
elt.Type,
ID = (from eld in db.Elds where eld.ELDTID == 2 && eld.ELID == el.ELID select eld.Value).FirstOrDefault(),
Company = (from eld in db.Elds where eld.ELDTID == 1 && eld.ELID == el.ELID select eld.Value).FirstOrDefault(),
Message = (from eld in db.Elds where eld.ELDTID == 5 && eld.ELID == el.EventLogID select eld.Value).FirstOrDefault(),
ET = (
from el1 in db.Els
join eld in db.Elds on el1.ELTID equals eld.ELDTID
where el1.ELID == el.ELID
select eld)
.Max(eld => eld.ET),
};
如果您没有导航属性(ELT 上的 EL 子集合、EL 上的 ELD 子集合、EL 和 ELD 上的父属性)我建议您添加它们,这将进一步简化查询(由 EF 注入的连接条件):
from elt in db.Elts
from el in elt.Els
...
我正在尝试将以下查询与 Entity framework 结合使用,这就是我尝试使用 linq 的原因。
SELECT DISTINCT
elt.Type,
( SELECT TOP 1 Value
from ELD
where ELDTID = 2 AND ELID = el.ELID
) ID,
( SELECT TOP 1 Value
from ELD
Where ELDTID = 1 AND ELID = el.ELID
) Company,
( SELECT TOP 1 Value
from ELD
Where ELDTID = 5 AND ELID = el.EventLogID
) Message,
( SELECT Max(ET)
FROM EL el
INNER JOIN ELD eld ON eld.ELID = el.ELTID
WHERE el.ELID = el.ELID
) ET
FROM EL el
INNER JOIN ITS.ELT elt ON elt.ELTID = el.ELTID
WHERE ELSID = 3
试试这个,也许你需要
(from el in _context.EL.Where(p=>p.ELSID == 3)
join elt from _context.ELT on elt.ELTID equals el.ELTID
let ID = el.ELD.Where(p=>p.ELDTID == 2 ).Select(p=>p.Value).FirstOrDefault()
let Company = el.ELD.Where(p=>p.ELDTID == 1 ).Select(p=>p.Value).FirstOrDefault()
let Message = el.ELD.Where(p=>p.ELDTID == 5 && p.ELID = el.EventLogID).Select(p=>p.Value).Max()
let ET = el.Select(p=>p.ET).MAX()
select new
{
elt.Type,
ID,
Company,
Message,
ET
}).ToList();
假设 ELT,从示例中看不出
ELSID
是 EL 还是 ELT 属性。我认为在您的 ET 子查询中发现了一个错误:
where el.ELID = el.ELID
。您可能想在一侧引用外部查询中的 el,但不能,因为您使用的是相同的名称。在此答案中对子查询 EL. 使用 el1
尝试创建一个匹配的数据模型(下次请提供给我们一个,因为您可能已经有了)。
public class Elt
{
public int ELTID;
public int ELSID;
public int Type;
}
public class El
{
public int ELID;
public int ELTID;
public int EventLogID;
}
public class Eld
{
public int ELDTID;
public int ELID;
public int ET;
public int Value;
}
public class Db
{
public IQueryable<El> Els;
public IQueryable<Elt> Elts;
public IQueryable<Eld> Elds;
}
你的 SQL 那么应该对应这个查询:
from el in db.Els
join elt in db.Elts on el.ELTID equals elt.ELTID
where elt.ELSID == 3
select new
{
elt.Type,
ID = (from eld in db.Elds where eld.ELDTID == 2 && eld.ELID == el.ELID select eld.Value).FirstOrDefault(),
Company = (from eld in db.Elds where eld.ELDTID == 1 && eld.ELID == el.ELID select eld.Value).FirstOrDefault(),
Message = (from eld in db.Elds where eld.ELDTID == 5 && eld.ELID == el.EventLogID select eld.Value).FirstOrDefault(),
ET = (
from el1 in db.Els
join eld in db.Elds on el1.ELTID equals eld.ELDTID
where el1.ELID == el.ELID
select eld)
.Max(eld => eld.ET),
};
如果您没有导航属性(ELT 上的 EL 子集合、EL 上的 ELD 子集合、EL 和 ELD 上的父属性)我建议您添加它们,这将进一步简化查询(由 EF 注入的连接条件):
from elt in db.Elts
from el in elt.Els
...