首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LINQ语句,以列出待运未完成项目的订单。

LINQ语句,以列出待运未完成项目的订单。
EN

Stack Overflow用户
提问于 2021-03-06 14:24:49
回答 1查看 81关注 0票数 2

我有一个问题,创建一个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:

代码语言:javascript
运行
复制
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声明:

代码语言:javascript
运行
复制
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:不能对包含聚合或子查询的表达式执行聚合函数。无法对包含聚合或子查询的表达式执行聚合函数。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-03-07 00:26:11

例外情况是,EF不能将linq '.Sum(x => x.Qty)‘转换为SQL。

在这种情况下,你必须做出决定,或者

现在没有,将来也不会有那么多数据,您将把整个相关的表实体带回来,并在.NET运行时中计算它--在本地执行多个步骤。

有太多的数据不能带回,最好是在Server中编写一个SPROC,它为您进行计算,并且只将结果带回运行您的.NET的服务器,而您只能在.NET运行时中进行比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66506708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档