Операция над множеством: как отфильтровать коллекцию на основе набора целых чисел - PullRequest
1 голос
/ 29 марта 2012

У меня есть это выражение:

var result = from pav in ProductAttributes
           join id in valueIds
           on pav.AttributeValueID equals id
           select pav.ProductImageID;

, который работает до определенного момента. Проблема заключается в том, что коллекция ProductAttributes содержит один и тот же продукт много раз для каждого атрибута. Это структура:

ID - уникальный

ProductID

ProductAttributeValueID

ProductImageID

Таким образом, Товар может появляться в коллекции много раз. Я хочу, чтобы результат фактически отфильтровал OUT всех продуктов, которые вообще не имеют совпадений в valueIds (это список ProductAttributeValueIDs).

Так что я хочу вернуть ТОЛЬКО продукты, которые имеют ВСЕ КОМБИНИРОВАННЫЕ valueIds, а не только ЛЮБОЙ из них, что и делает вышеприведенное выражение linq.

PS Я могу опубликовать код SQL, который показывает, что я имею в виду в SQL, если это поможет!

@ devgeezer опубликовал ответ, который был достаточно близок, но работал только для одного значения.

Я закончил с кодом ниже, который работает. Я группирую по ProductID, затем использую его во втором запросе для фильтрации исходной коллекции:

        var result = 
            from pav in ProductAttributeValues
            join id in valueIds
            on pav.AttributeValueID equals id
            group pav by pav.ProductID into gj
            where gj.Count() == valueIds.Count()
            select gj.Key;

        var imageIds = from pav in ProductAttributeValues
                       join id in result
                       on pav.ProductID equals id 
                       select pav.ProductImageID;

1 Ответ

3 голосов
/ 29 марта 2012

Вы можете попробовать подход с использованием групп и фильтров, например:

var result = 
    from pav in ProductAttributes
    join id in valueIds
    on pav.AttributeValueID equals id
    group pav by pav.ProductImageID into gj
    where gj.Count() == valueIds.Count()
    select gj.Key;
...