首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在同一个字段中带有和运算符的Linq到Sql

在同一个字段中带有和运算符的Linq到Sql
EN

Stack Overflow用户
提问于 2010-03-10 15:53:56
回答 2查看 5.5K关注 0票数 4

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

代码语言:javascript
运行
复制
(from od in OrderDetails
where od.ProductID == 11 || od.ProductID == 42
select od.OrderID).Distinct()

这给了我一个订单Ids列表(67个项目),其中订单包括产品11或42。如果订单同时包含产品11和42,我如何重写查询以给出订单I列表?生成的列表应该只包含一个订单(orderid = 10248)

显然,下面的查询不返回任何订单。

代码语言:javascript
运行
复制
(from od in OrderDetails
    where od.ProductID == 11 && od.ProductID == 42
    select od.OrderID).Distinct()

这里有一个sql查询,它可以完成这项工作,但是用linq编写它的最好(或最有效)方法是什么呢?

代码语言:javascript
运行
复制
    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),该表达式可以获取产品i的动态列表,在where子句中使用它们,并返回订单列表。如果有人感兴趣的话,就在这里。

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-10 16:12:43

相反,启动对订单关系的查询:

代码语言:javascript
运行
复制
var result = Orders.Where(o => o.OrderDetails.Any(od => od.ProductId == 11) 
                            && o.OrderDetails.Any(od => od.ProductId == 42));
票数 3
EN

Stack Overflow用户

发布于 2010-03-10 16:00:45

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

代码语言:javascript
运行
复制
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);

另一种(可能更有效)的方法是通过连接:

代码语言:javascript
运行
复制
(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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2418308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档