C # LINQ — включить условие Where только в том случае, если оно не равно null

#c# #.net #linq

#c# #.net #linq

Вопрос:

У меня есть несколько входных параметров, которые я хочу проверить в предложении where, но я хочу проверить, только если параметр не равен null. Если оно не равно null, я не хочу, чтобы этот параметр был в предложении where .

Текущая работа выглядит следующим образом:

 if(userId != null){
list.Where(x=> x.Id == id amp;amp; x.UserId == userId);
}
else{
list.where(x=> x.Id == id)
}
  

Это невозможно, если у нас есть несколько параметров, которые могут быть null или not null, поскольку это создало бы вложенные условия if . Что может быть лучшим решением здесь?

Комментарии:

1. list.Where(x=> x.Id == id amp;amp; (userId == null || x.UserId == userId)) или var query = list.where(x=> x.Id == id) тогда query = userId != null ? query.Where(x.UserId == userId) : query;

Ответ №1:

Вы можете создать расширение;

 public static IEnumerable<T> WhereIf<T>(
    this IEnumerable<T> source, 
    bool condition, 
    Expression<Func<T, bool>> predicate)
{
    return condition
        ? source.Where(predicate)
        : source;
}
  

и используйте его следующим образом;

 list.Where(x=> x.Id == id)
    .WhereIf(userId != null, x=> x.UserId == userId);
  

Взято из https://github.com/abpframework/abp/blob/ce991482b7e83f369045073986e9c7fdd2b18534/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpEnumerableExtensions.cs#L42

Существует также IQueryable версия.

Комментарии:

1. Это было довольно аккуратно. Спасибо!

Ответ №2:

Вы можете сделать это следующим образом, используя встроенную инструкцию if:

 list.Where(x =>
   (x.Id == id) amp;amp;
   (x.UserId == (userId != null) ? userId : x.UserId)
);
  

Я не знаю, единственное ли это решение, но оно решило мою проблему.

Ответ №3:

Попробуйте это:

 list.Where(x=> x.Id == id amp;amp; (userId == null || userId == x.UserId));
  

Ответ №4:

Я предлагаю работать с IEnumerable , в данном случае и комбинировать запросы:

 var query = list.Where(x=> x.Id == id);

if (userId != null)
{
   query = query.Where(x => x.UserId == userId);
}

var result = query.ToList();
  

Тот же подход применим к IQueryable