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