在同一字段上使用And运算符将Linq转换为Sql

在同一字段上使用And运算符将Linq转换为Sql,sql,linq,Sql,Linq,我有以下linq查询(应用于Northwind数据库) 这给了我一个订单ID(67项)列表,其中订单包括产品11或42。如何重写查询以提供订单ID列表,其中订单同时包含产品11和42?结果列表应仅包含一个订单(orderid=10248) 显然,下面的查询不会返回任何订单 (from od in OrderDetails where od.ProductID == 11 && od.ProductID == 42 select od.OrderID).Distin

我有以下linq查询(应用于Northwind数据库)

这给了我一个订单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)))
[编辑]

感谢克劳斯比斯科夫的解决方案。因此,我能够构建一个表达式(使用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;
}
公共静态表达式,其中ProductIDListQualsand(int[]ProductID)
{
var condition=PredicateBuilder.True();
foreach(productIds中的变量id)
{
condition=condition.And(o=>o.OrderDetails.Any(od=>od.ProductId==id));
}
返回条件;
}

当然,您可以将其简化为一个查询,但这是可行的:

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()

改为对订单关系启动查询:

var result = Orders.Where(o => o.OrderDetails.Any(od => od.ProductId == 11) 
                            && o.OrderDetails.Any(od => od.ProductId == 42));

很好的一点-我也在想同样的事情,但我想也许他没有接触到那种关系。嗨,克劳斯比斯科夫,谢谢你的回答。它工作得很好。我可以再问一个问题吗?如果我在运行时得到一个productID的动态列表,有没有什么方法可以让它们进入linq查询?也许可以使用PredicateBuilder?
var result = Orders.Where(o => o.OrderDetails.Any(od => od.ProductId == 11) 
                            && o.OrderDetails.Any(od => od.ProductId == 42));