Я бы сделал:
var filteredModels = from model in originalModels
let mAttribs = from pa in model.ProductAttributes
where orAttributes.Contains(pa.AttributeId)
select pa.AttributeType
where !andAttrGrpIds.Except(mAttribs).Any()
select model;
Теперь это более читабельно и (вероятно) имеет лучший профиль производительности.
Идея состоит в том, чтобы получить набор всех «подходящих» типов атрибутов продукта из каждой модели, а затем проверить, присутствуют ли все andAttrGrpIds
в этом наборе.
Кстати, ваши соглашения об именах кажутся довольно странными: коллекция andAttrGrpIds
, по-видимому, фактически представляет коллекцию атрибутов - типов .