#c_sharp #net #linq #инспекция_кода
У меня есть класс Item
public class Item
{
public int ParentId {get;set;}
public int TypeId {get;set;}
public int? AttachedFileId {get;set;}
}
Мне необходимо для каждого родителя получить признак наличия того или иного типа.
Наличием считается что отсутствуют item без прикрепленного файла, написал следующий запрос:
var items = _context.Set()
.GroupBy(x=>x.ParentId)
.Select(x=>new
{
ParentId = x.Key,
Type1 = x.Where(x=>x.TypeId==1).Any() && x.Where(x=>x.TypeId==1).All(x=>x.AttachedFileId!=null)
//И так для каждого типа
})
Запрос возвращает данные так как мне необходимо, но мне кажется что условие
x.Where(x=>x.TypeId==1).Any() && x.Where(x=>x.TypeId==1).All(x=>x.AttachedFileId!=null)
можно переписать
Также меня смущает, что метод All для пустой коллекции возвращает true
Пример на fiddle
Ответы
Ответ 1
С точки зрения математики всё верно: метод All — это аналог квантора всеобщности, а для пустых множеств он всегда верен, независимо от условия. Этот метод реализован так (за вычетом проверок): public static bool All(this IEnumerable source, Func predicate) { foreach (TSource element in source) if (!predicate(element)) return false; return true; } Упростить ваше выражение что-то не очень получается. Разве что нагромоздить переменные для одного прохода, но с грубым нарушением идеи функциональщины: bool any = false; bool result = x.Where(x => any = x.TypeId == 1).All(x => x.AttachedFileId != null) && any;
Комментариев нет:
Отправить комментарий