Используйте WhereIf для нескольких условий в c# - PullRequest
0 голосов
/ 17 апреля 2020

Привет, может кто-нибудь помочь мне, как лучше всего использовать whereif в LINQ, здесь у меня есть код, который отлично работает, но я хочу преобразовать этот запрос с 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();
    }

Я пробовал его с Где, если нет, но не удалось. Вот ссылка, по которой я следовал. https://extensionmethod.net/csharp/ienumerable-t/whereif

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

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;
}

PS примечание. Я изменил ваше возвращаемое значение, хотя await.

по-прежнему нет.
0 голосов
/ 21 апреля 2020
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();
...