#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);
Существует также 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