在 C# 中将 WhereIf 用于多个条件
Use WhereIf for multiple condition in c#
你好,有人可以帮助我如何在 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 ienumerable 试过了,但没有成功。这是我遵循的 link 。
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;
}
P.S。请注意,我更改了您的 return 值,但仍然没有 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();
你好,有人可以帮助我如何在 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 ienumerable 试过了,但没有成功。这是我遵循的 link 。 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;
}
P.S。请注意,我更改了您的 return 值,但仍然没有 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();