三特里林克查询
本文关键字:查询 林克 | 更新日期: 2023-09-27 18:37:02
我正在尝试用 C# 编写一个 linq 查询,该查询将返回收到他们订购的所有商品但无法弄清楚的客户列表
我的数据库架构如下所示:
表名称:客户,主字段:客户 ID
表名称:订单,主字段:订单 ID,外键:客户 ID
表名称:订单行项,主字段:行项 ID,外键:订单 ID
订单项表还有一个名为"状态"的字段,我在其中指示此项目是否已"已订购"、"缺货"、"已发货"等。
我正在寻找的是至少有一个订单的客户列表(我对没有订购任何东西的客户不感兴趣),我只对至少有一个项目的订单感兴趣(以防万一有人创建一个没有任何项目的空订单),最后我的最后一个标准是所有项目都必须具有给定的状态(比如: 例如"已发货")。
如果我要编写SQL查询,它将如下所示:
SELECT c.*
FROM Customers c
INNER JOIN Orders o ON c.CustomerId = o.CustomerId
INNER JOIN (SELECT oli.OrderId, COUNT(*) AS [NumberOfItems] FROM OrderLineItems oli WHERE oli.Status <> 'Shipped' GROUP BY oli.OrderId) items ON o.OrderId = items.OrderId
WHERE items.NumberOfItems = 0
(顺便说一下,如果您能想到更好的方法来获取我正在寻找的数据,请随时建议更好的SQL查询)
理想情况下,我会得到如下所示的 C# 代码:
var customers = from c in context.Customers
where ...
select c;
customers.Where(c => c.Orders.Any(o =>
o.OrderLineItems.Any()
&& o.OrderLineItems.All(i => i.Status == requestedStatus)))
Orders.Any()
标准是针对您的要求"至少有一个订单的客户";"我只对至少一件商品的订单感兴趣"的OrderLineItems.Any()
标准,以及"所有商品必须具有给定状态"的OrderLineItems.All()
标准。