将复杂查询转换为 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
...