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

时间:2017-12-18 21:03:56

标签: c# sql linq

我想要完成的事情。我有一个包含产品的表,一个包含选项的表,以及一个包含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);

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

试试这个:

my $height = system("identify -format %h $curPic");
my $width = system("identify -format %w $curPic");