логическое выражение для Где - PullRequest
0 голосов
/ 26 апреля 2011

Я фильтрую данные, используя переменную Nullable.
Если переменная равна нулю, фильтр выключен.
Есть ли лучший способ написать:

GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))

(у меня более 4 фильтров, и это выглядит как огромный беспорядок)

Ответы [ 3 ]

3 голосов
/ 26 апреля 2011

Ваш пример:

GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))

можно записать с помощью оператора объединения нулей ??:

GetQuery().Where( pd => pd.CustomerID == ( customerId ?? pd.CustomerID ) )

Не уверен, что это улучшит ситуацию, но это вариант.

2 голосов
/ 26 апреля 2011

Возможно, вы можете использовать метод расширения для его создания.

public static IQueryable<T> OptionalWhere<T>(this IQueryable<T> query, int? id, Expression<Func<T, int, bool>> filter)
{
    if (id.HasValue)
    {
        var idValue = id.Value;
        query = query.Where(e => filter(e, idValue));
    }
    return query;
}

Тогда запрос становится:

var q = GetQuery().OptionalWhere(customerId, (pd, id) => pd.CustomerId == id);
1 голос
/ 26 апреля 2011

Нет, нет лучшего способа написать то же самое.Однако я должен сказать, что для логики, которую вы хотите (которая не является стандартным значением null в типе Nullable), она довольно коротка.Я не думаю, что вы можете ожидать, что вы получите что-то более короткое.

Я не нахожу это особенно нечитаемым или грязным, даже если у вас было 4 или даже 10 копий этой строки друг под другом.Самое короткое, о чем я могу думать, это:

GetQuery().Where(pd => customerId == null || pd.CustomerId == customerId)
          .Where(pd => customerName == null || pd.CustomerName == customerName)
          .Where(pd => customerAddress == null || pd.CustomerAddress == customerAddress)
          .Where(pd => customerPostcode == null || pd.CustomerPostcode == customerPostcode)
          .Where(pd => customerCountry == null || pd.CustomerCountry == customerCountry)
          .Where(pd => customerPhoneNumber == null || pd.CustomerPhoneNumber == customerPhoneNumber)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...