#linq #c#-4.0
#linq #c #-4.0
Вопрос:
Рассмотрим следующий пример:
public List<Allergy> GetAllergies(int? ingredientId = null)
{
var allergies = new List<Allergy>();
var preSelect = ingredientId != null
? _dataContext.Ingredients.Where(x=> x.Id == ingredientId).SelectMany(x=>x.Allergies.AsQueryable())
: _dataContext.Allergies.AsQueryable();
preSelect.ToList().ForEach(x =>
{
var a = Mapper.Map<Database.Allergy, Allergy>(x);
allergies.Add(a);
});
return allergies;
}
Это работает, но я считаю, что можно избавиться от части проверки null и получить все ингредиенты, если ingredientId
значение null прямо там, в Where()
теле. Как мы можем это сделать? Также будут оценены любые другие предложения по улучшению этого фрагмента кода.
Ответ №1:
Попробуйте это: вы можете думать о предложении where как о if
инструкции.
_dataContext.Ingredients.Where( x => x.Id != null amp;amp; x.Id == ingredientId)
(Предполагается, что x.Id
также имеет тип int?
)
Комментарии:
1.
x => x.Id == null || x.Id == ingredientId
илиx => !(x.Id != null amp;amp; x.Id != ingredientId)
я бы подумал. (Я добавил вторую форму, потому что Resharper иногда жалуется на первую, хех.)
Ответ №2:
Попробуйте это:
var preSelect =
_dataContext
.Ingredients
.Where
(
x=> (!ingredientId.HasValue || x.Id == ingredientId)
)
.SelectMany(x=>x.Allergies.AsQueryable());