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