【问题标题】:Set operation: how to filter a collection based on a COMBINED set of ints集合操作:如何根据 COMBINED 集合来过滤集合
【发布时间】:2012-03-28 21:09:16
【问题描述】:

我有这样的表达方式:

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

这在一定程度上起作用。问题是对于每个属性,集合 ProductAttributes 多次包含相同的产品。它的结构是:

ID - 唯一

产品编号

ProductAttributeValueID

产品图像ID

所以一个产品可能会在集合中出现多次。我希望结果实际上过滤掉所有在 valueIds (这是 ProductAttributeValueIDs 列表)中根本没有任何匹配项的产品。

所以我只想返回具有所有 COMBINED valueId 的产品,而不仅仅是其中的任何一个,这就是上面的 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;

【问题讨论】:

  • 您的问题有点难以理解,如果您实际发布问题中提到的所有代码部分,这将有所帮助。
  • @AdrianIftode 是的,很抱歉之前没有提到它
  • @ChibuezeOpata 抱歉,我知道,这很难解释!但我现在得到了答案,它希望能显示出我想要实现的目标。

标签: c# linq collections filter set


【解决方案1】:

您可以尝试如下的分组和过滤方法:

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;

【讨论】:

  • 谢谢,这是一个巨大的帮助。
猜你喜欢
  • 2020-02-01
  • 2018-12-11
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多