如何使用LINQ连接子查询

如何使用LINQ连接子查询,linq,.net-core,entity-framework-core,Linq,.net Core,Entity Framework Core,我不熟悉实体框架和LINQ,正在努力将SQL查询转换为其语法 给定的是一个表,其中包含以订单号、数量、物料等为列的生产订单。此外,还有一个列时间戳 如果订单的数量将被更新,这将导致表中出现一个全新的条目,其中所有值都将与前一行相同,但表示更改时间和包含新值的数量的时间戳除外。因此,允许我有一个订单的历史记录 使用SQL仅选择特定订单的最新版本可能如下所示: 选择p1* 来自dbo.ProductionOrders作为p1 将SELECT ORDERNAME、MAXTimestamp作为时间戳从d

我不熟悉实体框架和LINQ,正在努力将SQL查询转换为其语法

给定的是一个表,其中包含以订单号、数量、物料等为列的生产订单。此外,还有一个列时间戳

如果订单的数量将被更新,这将导致表中出现一个全新的条目,其中所有值都将与前一行相同,但表示更改时间和包含新值的数量的时间戳除外。因此,允许我有一个订单的历史记录

使用SQL仅选择特定订单的最新版本可能如下所示:

选择p1* 来自dbo.ProductionOrders作为p1 将SELECT ORDERNAME、MAXTimestamp作为时间戳从dbo.ProductionOrders组按ORDERNAME作为p2连接 在p1.OrderNumber=p2.OrderNumber和p1.Timestamp=p2.Timestamp上 其中p1.OrderNumber='order-182736' 与我在C代码中完成的功能相同,如下所示:

var productionOrder=\u db.ProductionOrders.Wherepo=>po.OrderNumber==order-182736 .OrderByDenseringPO=>po.Timestamp .FirstOrDefault; 当我想要得到多行时,我就迷失了方向。例如,特定物料的所有订单。使用SQL,我只需调整WHERE条件:

选择p1* 来自dbo.ProductionOrders作为p1 将SELECT ORDERNAME、MAXTimestamp作为时间戳从dbo.ProductionOrders组按ORDERNAME作为p2连接 在p1.OrderNumber=p2.OrderNumber和p1.Timestamp=p2.Timestamp上 其中p1.材料=42 我找到的使用LINQ的JOIN示例不适用于子查询,我的主要来源是


如何使用LINQ获取特定物料的所有最新版本的订单?

您可以使用与SQL完全相同的方法来完成此操作_LINQ to Entities中的db.ProductionOrders表示SQL中的dbo.ProductionOrders,您可以在顶级和子查询级别使用它:

var query=\u db.ProductionOrders .Join_db.ProductionOrders .GroupByp2=>new{p2.OrderNumber} .Selectg=>new{g.Key.OrderNumber,Timestamp=g.Maxe=>e.Timestamp},//子查询 p1=>new{p1.OrderNumber,p1.Timestamp},p2=>p2,//连接条件 p1,p2=>p1//结果选择器p1* 其中p1=>p1.材料==42; 注意:不确定标签在SQL查询中来自何处,所以请改用OrderNumber

或者,如果愿意,在LINQ查询语法中也可以使用相同的语法:

变量查询= 来自p1 in_db.ProductionOrders 将p2从p2加入到_db.ProductionOrders中 通过新的{p2.OrderNumber}将p2分组到g中 选择new{g.Key.OrderNumber,Timestamp=g.Maxp2=>p2.Timestamp} 在新的{p1.OrderNumber,p1.Timestamp}上等于p2 其中p1.材料==42 选择p1; 标签仍然在那里,因为我做了一些复制和粘贴错误,我改变了操作。我需要一些时间来把我的头围绕林克。。。