2010-11-03 46 views
-2

我正在尝试对相关产品对象列表执行LINQ查询。我必须按CategoryId对它们进行分组,因此我使用了group by子句。不幸的是,我只是意识到我不能简单地在最后使用'select g.Value'。该组是一个IGrouping,我想在这里返回RelatedProduct。我怎样才能做到这一点?如何在LINQ中进行分组

同样在我的情况下,一个产品可以同时在两个类别,所以我怎样才能防止LINQ返回重复?我只对第一类感兴趣(实际上,只要它被分配给该产品,这并不重要)。

var query = from rp in context.RelatedProducts 
        join p in context.Products on rp.ProductId2 equals p.ProductId 
        join pc in context.ProductCategories on p.ProductId equals pc.ProductId 
        where rp.ProductId1 == productId1 && 
        !p.Deleted && 
        (showHidden || p.Published) 
        orderby rp.DisplayOrder 
        group rp by pc.CategoryId into g 
        select g; 
+0

如果你只在第一类感兴趣,那么为什么不直接加在那里pc.CategoryId == interestingcategory而不是分组,然后丢弃以外的所有组首先? – 2010-11-03 11:23:42

+0

当我说有更多的类别我的意思是产品和类别之间有多对多的关系。这就是我正在处理的数据库的结构。我实际上只使用每种产品的一个类别。 – 2010-11-03 11:28:02

回答

-2

我设法做到这一点是这样的:

List<RelatedProduct> relatedProducts = new List<RelatedProduct>(); 
     foreach (var group in query) 
     { 
      var key = group.Key; 
      relatedProducts.AddRange(group.ToList()); 
     } 
+2

在这种情况下,你不能在查询中打了一个.SelectMany(g => g).ToList()并得到相同的结果吗? – Frank 2010-11-03 12:55:37

+0

如果我知道如何,我可以有:))这是我期望的答案:D – 2010-11-03 13:27:34

0

在你的情况gIEnumerable,所以你可以只使用select g.First()或申请任何额外的滤波给它。