LINQ选择具有不同ForeignKeyId列的最新记录

时间:2018-02-16 08:53:58

标签: c# sql entity-framework linq

我有以下SQL查询:

SELECT 
   table1.Id AS EinAusgangId, 
   table1.Ausgabedatum, 
   table1.Rueckgabedatum, 
   table1.WerkzeugId, 
   cpmWerkzeug.Name
FROM cpmEinAusgang AS table1 
INNER JOIN cpmWerkzeug ON table1.WerkzeugId = cpmWerkzeug.Id
WHERE table1.Id = (SELECT MAX(Id) AS Expr1 
                   FROM dbo.cpmEinAusgang
                   WHERE table1.WerkzeugId = WerkzeugId)

我的目标是将整个查询转换为LINQ语句,以便在.Net应用程序中进一步使用。我已经将连接表转换为LINQ,但也可以在select子句中使用where吗?

这是我到目前为止所得到的,它给出了与上面的SQL语句几乎相同的结果,但是当表cpmEinAusgang包含一个cpmWerkzeug的多个记录时出现重大错误

using (var dbContext = new cpmEntities())
{
  var werkzeuge = from w in dbContext.cpmWerkzeug
  join e in dbContext.cpmEinAusgang
  on w.Id equals e.WerkzeugId
  where e.Rueckgabedatum == null
  orderby w.Name
  select w;

  return werkzeuge.ToList();
}

有谁知道如何在linq中实现上述sql? 谢谢你的帮助。 :)

编辑:已解决(见下文)

2 个答案:

答案 0 :(得分:2)

var werkzeugeImUmlauf = from w in dbContext.cpmWerkzeug
                                join e in dbContext.cpmEinAusgang
                                on w.Id equals e.WerkzeugId
                                where e.Id == dbContext.cpmEinAusgang.Where(x => x.WerkzeugId == e.WerkzeugId).Max(x => x.Id) select w;

这是最终的解决方案。正如Mittal在他的回答中所提到的,可以在LINQ中编写子查询。

答案 1 :(得分:1)

是的,您也可以在LINQ中编写Sub Query

 var werkzeuge = from w in dbContext.cpmWerkzeug
  join e in dbContext.cpmEinAusgang
  on w.Id equals e.WerkzeugId
  where w.id = (dbContext.cpmEinAusgang.Max(x => x.id)) AND w.WerkzeugId = WerkzeugId