我有一个问题,创建一个LINQ语句,以选择订单,其中仍有项目需要发货。
简化模型如下:
SalesOrder
SalesOrderId (PK)
SalesOrderItem
SalesOrderItemId (PK)
描述(字符串)
SalesOrderId (FK)
ProductId(FK)
Qty (int)
产品
ProductId (PK)
描述
虚拟(位)
船运
ShipmentId (PK)
ShipmentItem
ShipmentItemId (PK)
SalesOrderItemId (FK)
Qty (int)
我需要一个LINQ语句,它生成一个销售订单列表,其中有一个尚未发货的项目数量(考虑到虚拟项目不需要发货这一事实)。
一个销售订单可以有多批与其相关的货物。每批货物都与销售订单有关。
装运项目的数量与销售订单项目的数量有关。它可以是所有的销售订单项目,也可以是部分。
已发货的订单是所有订单都已发货的订单(总订购数量=总发货数量)。尚未完成的销售订单仍有未完成的数量有待发运。
我不知道从哪开始从一个表到另一个表比较一个qty的和,在一个清晰、简洁和经济的LINQ语句中。
这就是实现我的目标的SQL:
SELECT a.* FROM
(
SELECT
o.SalesOrderId,
SUM(i.Qty) AS QtyOrdered,
SUM(ISNULL(s.Qty,0)) AS QtyShipped
FROM SalesOrder o
INNER JOIN SalesOrderItem i ON i.SalesOrderId = o.SalesOrderId
INNER JOIN Product p ON p.ProductId = i.ProductId
LEFT JOIN ShipmentItem s ON s.SalesOrderItemId = i.SalesOrderItemId
WHERE p.Virtual = 0
GROUP BY o.SalesOrderId) a
WHERE QtyOrdered > QtyShipped
我亦曾尝试以下EF声明:
var salesOrders = await _context.SalesOrder.Where(p => p.SalesOrderItems.Sum(x => x.Qty) > p.SalesOrderItems.Sum(i => i.ShipmentItems.Sum(f => f.Qty))).ToListAsync();
这将导致错误:
SqlException:不能对包含聚合或子查询的表达式执行聚合函数。无法对包含聚合或子查询的表达式执行聚合函数。
谢谢
发布于 2021-03-07 00:26:11
例外情况是,EF不能将linq '.Sum(x => x.Qty)‘转换为SQL。
在这种情况下,你必须做出决定,或者
现在没有,将来也不会有那么多数据,您将把整个相关的表实体带回来,并在.NET运行时中计算它--在本地执行多个步骤。
有太多的数据不能带回,最好是在Server中编写一个SPROC,它为您进行计算,并且只将结果带回运行您的.NET的服务器,而您只能在.NET运行时中进行比较。
https://stackoverflow.com/questions/66506708
复制相似问题