sql - 在同一字段上使用 And 运算符的 Linq to Sql

标签 sql linq

我有以下 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;
}

最佳答案

改为开始对订单关系的查询:

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

关于sql - 在同一字段上使用 And 运算符的 Linq to Sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2418308/

相关文章:

c# - Linq to entities 无法识别方法 system.string get_Item

c# - 使用 LINQ 过滤掉空集合属性

mysql - 通过 join 在 mysql 上排名

javascript - 多表查询 + 指定返回值

c# - 将对象列表转换为对象属性之一的数组

c# - linq从两个数据库查询

c# - 按多个键值对数组进行排序

.net - 在应用程序中使用 StoredProcs

php - 使用 CTE 的 SQL 错误

sql - 如何根据另一列的分位数将新列插入标签为“1”/“2”/“3”/“4”#的数据库中?