C#Linq .Contains()。Any()。All()在一组id上带有一组id

问题描述 投票:0回答:2

我正在努力实现的目标。我有一个包含产品的表,一个包含选项的表,以及一个包含productoptions的表。

我想要做的是根据可变的选项数组来提取产品,我想只返回与这些选项匹配的产品。请记住,它可能与产品的所有可用选项都不匹配。

Any()似乎有效,但它返回所有匹配单个选项的产品,例如灰色或方形,而不是灰色和方形。

当我通过产品选项中的所有可能选项时,All()似乎才有效。

Contains()生产与Any()相同。

下面是我想要完成的,如果我手动输入id,这是有效的,但我有一个这些选项id的数组(和大小更改),我似乎无法弄清楚如何使用它数组。

var newproducts = (from prod in products
                   where prod.optionids.Any(o => o == 1) &&
                       prod.optionids.Any(o => o == 6) &&
                       prod.optionids.Any(o => o == 4) 
                   select prod);

请帮忙,我似乎无法找到另一个答案。

c# sql linq
2个回答
1
投票

foreach和每个产品验证它是否具有预期的选项...

var products = new[]{
    new {id=1, optionIds = new []{1, 2, 3, 4, 5}},
    new {id=2, optionIds = new []{1, 2, 3, 4}},
    new {id=3, optionIds = new []{1, 2, 3}},
    new {id=4, optionIds = new []{1, 2}},
};

var options = new []{4, 5};

var matchAny = from prod in products
            let found = (from id in prod.optionIds
                         join option in options
                             on id equals option
                         select id).Any()
            where found
            select prod;

output
1 2 3 4 5
1 2 3 4

var matchAll = from prod in products
            let found = options.All(p=>prod.optionIds.Contains(p))
            where found
            select prod;

output
1 2 3 4 5

编辑

如果您正在寻找方面,也许您需要反转查询,枚举所有选项并投影相应的计数器和相关产品

var query = from option in options
            let match = from product in products
                    where product.optionIds.Contains(option)
                    select product
            select new
            {
                Option = option,
                Counter = match.Count(),
                Products = match.Select(p=>p.id)
            };


Option Counter Products
4   2   1
        2
5   1   1

1
投票

试试这个:

var newproducts = 
    from prod in products
    where new [] { 1, 6, 4 }.All(x => prod.optionids.Contains(x)) 
    select prod;
© www.soinside.com 2019 - 2024. All rights reserved.