在循环中使用 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 与多个 where 转换为 SQL 一起使用?