在c#中使用WhereIf进行多个条件

问题描述 投票:0回答:3

嗨,有人可以帮助我如何最好地在 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

c# linq ienumerable query-performance iqueryable
3个回答
2
投票

WhereIf
不太适合您的情况,原因有两个:

  1. 您在
    if-else
    上调用两个不同的函数,而
    WhereIf
    的构建是为了接受在满足某些
    predicate
    时执行的单个函数 (
    condition
    )。
  2. 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


0
投票
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;
    }
}

干杯:)


-2
投票
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();
© www.soinside.com 2019 - 2024. All rights reserved.