三特里林克查询

本文关键字:查询 林克 | 更新日期: 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()标准。