【问题标题】:Add Lambda Expression on Column to Linq .Where()将列上的 Lambda 表达式添加到 Linq .Where()
【发布时间】:2011-03-09 22:18:28
【问题描述】:

我有两个表,订单和客户,订单引用客户,以及它们的映射类订单和客户。

我想编写一个方法来接收订单和客户的 Linq Where() 条件:

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
        Expression<Func<Customer, bool>> customerCondition)
{
    var q = Database.Query<Order>().Where(orderCondition);
    q = q.Where(o => o.Customer APPLY customerCondition); // how ?

    ... process records in q ...
}

即使在 MSDN 上阅读了大量关于此主题的 SO 答案和相关文章后,我似乎还是无法弄清楚如何在 Order.Customer 属性上应用客户条件。

(使用的 DB/ORM 是 Oracle/DevExpress,但我对通用解决方案很好,所以我没有将它们包含在标签中。请说明您的答案是否仅限于特定 DB 或 ORM)

【问题讨论】:

    标签: linq iqueryable


    【解决方案1】:

    这是实现它的一种方法。

    void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
            Expression<Func<Customer, bool>> customerCondition>>)
    {
        var orders = Database.Query<Order>().Where(orderCondition);
        var customers = Database.Query<Customer>().Where(customerCondition);
    
        var q = from o in orders join c in customers on o.CustomerId == c.Id
                select new {o, c}
    }
    

    同样,根据 ORM,这样的事情也可能有效(我假设这里有一个延迟加载的 Customer.Orders 集合属性):

    void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
            Expression<Func<Customer, bool>> customerCondition>>)
    {
        var customers = Database.Query<Customer>().Where(customerCondition);
    
        var q = from c in customers
                let orders = c.Orders.Where(orderCondition)
                select new {c, orders}
    
    }
    

    任何解决方案都必须针对特定的 linq 提供者进行测试,因为不同的 linq 提供者可能支持也可能不支持某些查询...

    【讨论】:

    • 感谢您提出 JOIN,Linq 似乎偶尔会影响我的数据库知识。但是,DevExpress 不支持连接,因此我的解决方案包含一个 customer.Where() 查询,并且使用该查询的 .Contains() 来限制订单。丑陋的 SQL,但它似乎可以工作。
    【解决方案2】:

    你可以试试这样的:

    var q = (from o in Database.Query<Order>().Where(orderCondition)
             join c in Database.Query<Customer>().Where(customerCondition) on o.CustomerID equals c.CustomerID
             select new { Order = o, Customer = c });
    

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      相关资源
      最近更新 更多