使用IQueryable In A Loop的实体框架WHERE OR查询



我正在使用实体框架核心构建一个中等规模的查询,在代码的一部分中,我正在循环遍历对象列表。

在这个列表中,如果满足特定的条件,我想创建一个WHERE查询(这很好,也很有效(。但是,一旦迭代了IQueryable,这个循环就会创建一个WHERE AND查询。我希望这个循环创建一个WHERE OR?这可能吗?

带有where query(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);   
}
}

我通过使用出色的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);
}

最新更新