首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Linq:有条件地向where子句添加条件

Linq:有条件地向where子句添加条件
EN

Stack Overflow用户
提问于 2012-06-05 00:24:12
回答 9查看 105.9K关注 0票数 117

我有一个这样的查询

代码语言:javascript
复制
(from u in DataContext.Users
       where u.Division == strUserDiv 
       && u.Age > 18
       && u.Height > strHeightinFeet  
       select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();

我想根据是否将这些条件提供给运行此查询的方法来添加各种条件,如年龄、身高。所有条件都将包括用户分区。如果提供了年龄,我想将其添加到查询中。类似地,如果提供了高度,我也想添加它。

如果这是使用sql查询完成的,我会使用字符串构建器将它们附加到主strSQL查询中。但在Linq中,我只能考虑使用IF条件,其中我将编写三次相同的查询,每个IF块都有一个额外的条件。有没有更好的方法来做这件事?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-06-05 00:31:47

如果您没有调用ToList()并最终映射到DTO类型,则可以在执行过程中添加Where子句,并在最后构建结果:

代码语言:javascript
复制
var query = from u in DataContext.Users
   where u.Division == strUserDiv 
   && u.Age > 18
   && u.Height > strHeightinFeet
   select u;

if (useAge)
   query = query.Where(u => u.Age > age);

if (useHeight)
   query = query.Where(u => u.Height > strHeightinFeet);

// Build the results at the end
var results = query.Select(u => new DTO_UserMaster
   {
     Prop1 = u.Name,
   }).ToList();

这仍然只会导致对数据库的一次调用,这将与在一次遍历中编写查询一样有效。

票数 213
EN

Stack Overflow用户

发布于 2016-03-11 10:07:20

我通常使用方法链接,但也有同样的问题。下面是我使用的扩展

代码语言:javascript
复制
public static IQueryable<T> ConditionalWhere<T>(
        this IQueryable<T> source, 
        Func<bool> condition,
        Expression<Func<T, bool>> predicate)
    {
        if (condition())
        {
            return source.Where(predicate);
        }

        return source;
    }

这有助于避免断链。同样,使用相同的ConditionalOrderByConditionalOrderByDescending也很有用。

票数 27
EN

Stack Overflow用户

发布于 2012-06-05 00:28:07

一种选择。

代码语言:javascript
复制
bool? age = null

(from u in DataContext.Users
           where u.Division == strUserDiv 
           && (age == null || (age != null && u.Age > age.Value))
           && u.Height > strHeightinFeet  
           select new DTO_UserMaster
           {
             Prop1 = u.Name,
           }).ToList();

或者,您可以切换到linq的方法语法,并使用if条件将表达式附加到where子句。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10884651

复制
相关文章

相似问题

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