Entity Framework 在循环中使用 IQueryable 进行 WHERE OR 查询
Entity Framework WHERE OR Query Using IQueryable In A Loop
我正在使用 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);
}
}
我是通过使用很棒的 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);
}
我正在使用 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);
}
}
我是通过使用很棒的 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);
}