在 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 不太适合您的情况,原因有两个:

  1. 您在 if-else 上调用两个不同的函数,而 WhereIf 被构建为接受单个函数 (predicate),如果某些 condition很满意。
  2. WhereIfIEnumerable<TSource> 的扩展方法,而您正试图将其用作 IQueryable<TSource>.
  3. 的扩展方法

如果你坚持,你必须为 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();