0

我正在尝试在 C# 中编写一个 linq 查询,它将返回收到他们订购的所有商品但无法弄清楚的客户列表

我的数据库架构如下所示:
表名:客户,主字段: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

(顺便说一句,如果您能想到更好的方法来获取我正在寻找的数据,请随意提出更好的 SQL 查询)

理想情况下,我会得到如下所示的 C# 代码:

var customers = from c in context.Customers
    where ...
    select c;
4

1 回答 1

6
customers.Where(c => c.Orders.Any(o => 
    o.OrderLineItems.Any() 
    && o.OrderLineItems.All(i => i.Status == requestedStatus)))

标准是针对您的Orders.Any()要求“至少有一个订单的客户”;OrderLineItems.Any()“我只对至少有一件商品的订单感兴趣”的标准,以及“OrderLineItems.All()所有商品必须具有给定状态”的标准。

于 2013-10-27T01:07:12.383 回答