我有以下linq查询(应用于Northwind数据库)
(from od in OrderDetails
where od.ProductID == 11 || od.ProductID == 42
select od.OrderID).Distinct()
其中给出了订单ID(67项)的列表,其中订单包括产品11或42.如何重写查询以向我提供订单ID列表,其中订单包括产品11和42 ?结果列表应仅包含一个订单(orderid = 10248)
显然,以下查询不会返回任何订单。
(from od in OrderDetails
where od.ProductID == 11 && od.ProductID == 42
select od.OrderID).Distinct()
这是一个执行该工作的SQL查询,但在linq中编写它的最佳(或最有效)方法是什么?
SELECT DISTINCT OrderID
FROM [Order Details]
WHERE (OrderID IN
(SELECT OrderID
FROM [Order Details] AS OD1
WHERE (ProductID = 11))) AND (OrderID IN
(SELECT OrderID
FROM [Order Details] AS OD2
WHERE (ProductID = 42)))
[编辑]
感谢klausbyskov的解决方案。从那以后,我能够构建一个表达式(使用PredicateBuilder),它可以获取产品ID的动态列表,在where子句中使用它们并返回一个订单列表。如果有人有兴趣的话。
public static Expression<Func<Order, bool>> WhereProductIdListEqualsAnd( int[] productIds )
{
var condition = PredicateBuilder.True<Order>();
foreach ( var id in productIds )
{
condition = condition.And( o => o.OrderDetails.Any( od => od.ProductId == id ) );
}
return condition;
}
答案 0 :(得分:3)
开始查询订单关系:
var result = Orders.Where(o => o.OrderDetails.Any(od => od.ProductId == 11)
&& o.OrderDetails.Any(od => od.ProductId == 42));
答案 1 :(得分:1)
当然,您可以将其简化为一个查询,但这可行:
var o1 = OrderDetails.Where( od => od.ProductID == 11).Select( od => od.OrderID );
var o2 = OrderDetails.Where( od => od.ProductID == 42).Select( od => od.OrderID );
var intersection = o1.Intersect(o2);
另一种(可能更有效)的方式是通过连接:
(from o1 in OrderDetails
join o2 in OrderDetails on o1.OrderID equals o2.OrderID
where o1.ProductID == 11 and o2.ProductID == 42
select o1.OrderID).Distinct()