在循环中使用 IQueryable 的实体框架 WHERE OR 查询

Posted

技术标签:

【中文标题】在循环中使用 IQueryable 的实体框架 WHERE OR 查询【英文标题】:Entity Framework WHERE OR Query Using IQueryable In A Loop 【发布时间】:2022-01-06 22:08:27 【问题描述】:

我正在使用 Entity Framework Core 构建一个中型查询,并且在我的代码的一部分中,我正在循环一个对象列表。

在此列表中,如果满足特定条件,我想创建一个 WHERE 查询(这很好并且可以工作)。但是,一旦 IQueryable 被迭代,这个循环就会创建一个 WHERE AND 查询。我希望这个循环创建一个 WHERE OR?这可能吗?

带有 where 查询 (queryable = IQueryable) 的循环示例。所以在这个循环中,我试图实现许多 WHERE OR,而不是 WHERE AND。希望这是有道理的。

foreach (var rfs in newsItemQuery.MyData.Where(x => x.Selected))

    if (rfs.IncludeNegative == false && rfs.IncludeNeutral == false)
    
        queryable = queryable.Where(x => x.Id == rfs.Id && x.IsNegative == false && x.IsNeutral == false);
    
    else if (rfs.IncludeNegative == false && rfs.IncludeNeutral)
    
        queryable = queryable.Where(x => x.Id == rfs.Id && x.IsNegative == false);
    
    else if (rfs.IncludeNegative && rfs.IncludeNeutral == false)
    
        queryable = queryable.Where(x => x.Id == rfs.Id && x.IsNeutral == false);
    
    else
    
        queryable = queryable.Where(x => x.Id == rfs.Id);   
    

【问题讨论】:

使用PredicateBuilder 来自LINQKi。如果您不想依赖,只需将其代码提取到您的项目中即可。 谢谢。我已经找到并实施了它。很棒的包:) 【参考方案1】:

我通过使用出色的 Nuget 包 LinqKit 来做到这一点

https://github.com/scottksmith95/LINQKit

这允许您使用谓词构建器,它有一个 .Or 选项

IQueryable<Product> SearchProducts (params string[] keywords)

  var predicate = PredicateBuilder.New<Product>();

  foreach (string keyword in keywords)
  
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  
  return dataContext.Products.Where (predicate);

【讨论】:

以上是关于在循环中使用 IQueryable 的实体框架 WHERE OR 查询的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先 IQueryable

IQueryable 实体框架 POCO 映射

实体框架,如何将 IQueryable 与多个 where 转换为 SQL 一起使用?

FakeItEasy DbSet / IQueryable<T> - 实体框架 6

试图模拟 IQueryable 实体框架查询

IQueryable 不包含 SingleOrDefault 的定义