嗨,有人可以帮助我如何最好地在 LINQ 中使用 whereif,这里我有一个可以正常工作的代码,但我想用WhereIf 转换此查询。
public async Task LoadQuery(IEnumerable<string> codes)
{
var query = _dBContext.QueryTable.Where(x => !x.InActive).AsQueryable();
if (codes!= null && codes.Any())
query = query.Where(x => codes.Contains(x.FirstCode) || query.Contains(x.SecondCode));
else
query = query.Where(x => !x.HasException.HasValue);
var data = query.ToList();
}
我已经尝试使用WhereIF enumerable 但没有成功。这是我关注的链接。 https://extensionmethod.net/csharp/ienumerable-t/whereif
WhereIf
不太适合您的情况,原因有两个:
if-else
上调用两个不同的函数,而 WhereIf
的构建是为了接受在满足某些 predicate
时执行的单个函数 (condition
)。 WhereIf
是 IEnumerable<TSource>
的扩展方法,而您尝试将其用作 IQueryable<TSource>
的扩展方法。如果你坚持的话,你必须为
IQueryable<TSource>
定义一个扩展方法,这样做时,只需将其定义为 WhereIfElse
:
public static class ExtensionMethods
{
public static IQueryable<TSource> WhereIfElse<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, bool> predicateIf, Func<TSource, bool> predicateElse)
{
if (condition)
return source.Where(predicateIf).AsQueryable();
else
return source.Where(predicateElse).AsQueryable();
}
}
所以,假设
query
的类型是 IQueryable<Item>
(将 Item
替换为您的实际类型):
public async Task<List<Item>> LoadQuery(IEnumerable<string> codes)
{
var query = _dBContext.QueryTable.Where(x => !x.InActive).AsQueryable();
query = query.WhereIfElse(
// condition
codes != null && codes.Any(),
// predicateIf
(Item x) => codes.Contains(x.FirstCode) || codes.Contains(x.SecondCode),
// predicateElse
(Item x) => !x.HasException.HasValue
);
var data = query.ToList();
return data;
}
附注请注意,我更改了您的返回值,尽管仍然没有
await
。
bool condition = codes!= null && codes.Any();
var data = _dBContext.QueryTable
.WhereIf(condition, a=> codes.Contains(a.FirstCode) || codes.Contains(a.SecondCode))
.WhereIf(!condition, a=> !a.HasException.HasValue && !a.InActive).ToList();
为
WhereIf
添加扩展方法,这里我们通过传递条件作为第一个参数和谓词作为第二个参数,为类型 Where
和 IEnumerable
扩展了 IQueryable
。
public static class LINQExtension
{
public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, bool> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
}
干杯:)
bool condition = codes!= null && codes.Any();
var data = _dBContext.QueryTable
.WhereIf(condition, a=> codes.Contains(a.FirstCode) || codes.Contains(a.SecondCode))
.WhereIf(!condition, a=> !a.HasException.HasValue && !a.InActive).ToList();