使用 linq 和条件进行左连接选择

Left join selecting with linq and a condition

我正在尝试 select 使用 linq 左连接来查找一次订购从未超过 50 件的所有产品。我不确定哪里出了问题。 这就是我所做的,但我没有得到正确的答案。

这是我的代码:

var q5 = from p in db.Products
                 join o in db.Orders on p.ProductID equals o.OrderID
                 join od in db.Order_Details on o.OrderID equals od.OrderID
                 where od.Quantity < 50
                 select p.ProductID;
        foreach (var p in q5)
        {
           Console.WriteLine(p);
        }

您想查找从未一次订购超过 50 件的产品。所以加入订单并没有多大帮助。您可以使用这种方法:

var productsWithLowOrders = db.Products
    .Where(p => !db.Orders
        .Any(o => p.ProductID == o.OrderID && db.Order_Details
            .Any(od => o.OrderID == od.OrderID && od.Quantity >= 50)));

此查询使用 Enumerable.Any,在 SQL 中,它将使用 NOT EXISTS + EXISTS.

转换为对相关表的子查询

所以这是我找到的最佳解决方案:

var q5 = from p in db.Products
                 from od in db.Order_Details
                 .Where (od => od.ProductID == p.ProductID)
                 .Where (od=> od.Quantity > 50).DefaultIfEmpty()
                 select (od.OrderID !=null ? "-" : p.ProductName)
                 ;
        foreach (var p in q5)
        {
            if(p != "-")
            {
                 Console.WriteLine(p);
            }   
        }