LINQ Where (), что делать, если мне нужно получить все?

#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());