【问题标题】:Build an IQueryable from multiple predicates从多个谓词构建 IQueryable
【发布时间】:2015-11-13 12:58:00
【问题描述】:

当过滤器属性具有值(非空)时,我想使用 where 条件构建查询。如果使用多个过滤器,则它们必须是 AND 组合。

当相应的属性值不为空时,如何组合/添加每个谓词以使最终查询准备好进行过滤?

IQueryable<Customer> filter = null;

Expression<Func<Customer, bool>> predicatetest1 = res => res.test1 == request.test1;
Expression<Func<Customer, bool>> predicatetest2 = res => res.test2 == request.test2;
Expression<Func<Customer, bool>> predicatetest3 = res => res.test3 == request.test3;

if (request.test1 != null)
{
     // add the above predicate to the filter
}

if (request.test2 != null)
{
    // add the above predicate to the filter
}

if (request.test3 != null)
{
   // add the above predicate to the filter
}

【问题讨论】:

    标签: entity-framework linq-to-entities iqueryable


    【解决方案1】:
    IQueryable<Customer> filter = Context.Customers;
    
    if (request.test1 != null)
    {
      filter = filter.Where(predicatetest1);
    }
    
    if (request.test2 != null)
    {
      filter = filter.Where(predicatetest2);
    }
    
    if (request.test3 != null)
    {
      filter = filter.Where(predicatetest3);
    }
    
    var customers = filter.ToList();
    

    当所有 3 个属性都不为空时,以下内容是等效的

    Context.Customers.Where(predicatetest1).Where(predicatetest2).Where(predicatetest3).ToList();
    

    【讨论】:

    • 当所有 3 个属性都不为空时,这将始终覆盖之前设置的过滤器。我希望所有 3 个过滤器都以 AND 样式使用。
    • @Elisabeth 不,这将链接 Where 方法导致 AND 样式。
    • @Elisabeth Where is an IQueryable 的返回值。所以基础查询+where
    • 所有 3 Where 方法都作为 predicate1 AND predicate2 AND predicate3 执行? 3 分隔的“OR”实际上在哪里对?
    • 但是正如我上面写的那样,我需要所有谓词的 AND。 :-) 我需要 PredicateBuilder 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多