我正在尝试在C#中编写一个linq查询,该查询将返回收到他们订购的所有项目的客户列表,但无法弄清楚
我的数据库模式如下所示:
表名:Customers,主要字段:CustomerId
表名:订单,主要字段:OrderId,外键:CustomerId
表名:OrderLineItems,主要字段:LineItemId,外键:OrderId
行项目表还有一个名为"状态"的字段,其中我指示此项目是否已"订购","延期交货","已发货"等.
我正在寻找的是至少有一个订单的客户列表(我对没有订购任何东西的客户不感兴趣),我只对至少有一件商品的订单感兴趣(以防万一有人创建了一个订单)没有任何项目的空订单),最后我的最后一个标准是所有项目必须具有给定的状态(例如:'发货').
如果我要编写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
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,如果你能想到一个更好的方法来获取我正在寻找的数据),请随意提出更好的SQL查询
理想情况下,我会得到C#代码,看起来像这样:
var customers = from c in context.Customers
where ...
select c;
Run Code Online (Sandbox Code Playgroud)
customers.Where(c => c.Orders.Any(o =>
o.OrderLineItems.Any()
&& o.OrderLineItems.All(i => i.Status == requestedStatus)))
Run Code Online (Sandbox Code Playgroud)
该Orders.Any()标准是为您的要求"的客户至少一个订单"; 该OrderLineItems.Any()标准为"我只在订单至少一个项目感兴趣",并OrderLineItems.All()为"所有项目必须有一个给定的状态"的标准.
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |