【问题标题】:Left join selecting with linq and a condition使用 linq 和条件进行左连接选择
【发布时间】:2016-05-24 10:37:08
【问题描述】:

我正在尝试使用 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);
        }

【问题讨论】:

    标签: c# linq left-join


    【解决方案1】:

    您想查找一次从未订购超过 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 转换为相关表的子查询。

    【讨论】:

    • @coco:我看不出问题所在。确切的信息是什么?
    • @coco:Wherefixed it之前缺少冒号
    • 如何选择产品?
    • @coco:它已经选择了产品。 db.Products.Where(...)。您没有任何不是通过Quantity &gt;= 50 订购的产品。尝试将值更改为&gt;=500。也许然后你会看到一些产品
    • 那么为什么这是我得到的“Finish_Linq_queries_from_class_4.Product”
    【解决方案2】:

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

    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);
                }   
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多