linq - 有没有更好的方法来编写这个 Linq 查询

标签 linq conditional-statements where-clause

示例

from O in db.Orders
join C in db.Customers on C.Id equals O.CustID
Where O.ord_date == ( filter.OrderDate != null ? filter.OrderDate : o.ord_date) &&
  c.Id == (filter.CustId != null ? filter.CustId : c.Id) &&
  o.ProductId == ( filter.ProductId != null ? filter.ProductId : o.ProductID)
select new {o,c}

//select new {c.Name, C.JoinDate, O.Value, O.NoofLineItems }

当我打开配置文件时,它有很多我期望的案例陈述。但我对在 C# 中输入的条件有更多的控制权,我怎样才能对 where 条件进行控制,并且仅在过滤器可用时才放置 where 条件

这将提高我发送到数据库的 sql 的质量。

亲切的问候 维奈。

最佳答案

此类问题的一般解决方案是使用 PredicateBuilder动态构造适当的谓词。

首先,构建谓词:

Expression<Func<Order, bool>> predicate = PredicateBuilder.True<Order>();

if (filter.OrderDate != null)
    predicate = predicate.And(o => o.ord_date == filter.OrderDate);

if (filter.CustId != null)
    predicate = predicate.And(o => o.CustId == filter.CustId);

...

然后你的查询就变成:

var filtered = db.Orders.Where(predicate);

var query = from O in filtered 
            join C in db.Customers on C.Id equals O.CustID
            select new {o,c};      

关于linq - 有没有更好的方法来编写这个 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5005920/

相关文章:

c# - 使用 LINQ 选择本周

sql - 如何将sql查询转换为linq

r - 如何使用 dplyr 通过条件语句过滤分组数据框?

python - Where 子句错误 : column does not exist

sql - 为什么要在字段上使用LEFT JOIN然后在以后的WHERE子句中将其过滤掉?

laravel - 在 jenssegers/laravel-mongodb 中使用 where

c# - 使用 Entity Framework 的右外连接

c# - 在 .NET 中有效地合并字符串数组,保持不同的值

php - 通过将数组传递给 MySQL PHP 中的查询来动态创建 OR 条件

c++ - 在代码内部、if 语句中使用#import