2010-11-03 2 views
-2

J'essaie de faire une requête LINQ à une liste d'objets RelatedProducts. Je dois les regrouper par CategoryId, donc j'utilise la clause group by. Malheureusement, je viens de réaliser que je ne peux pas simplement utiliser 'select g.Value' à la fin. Le groupe est une IGrouping et je veux retourner juste le RelatedProduct ici. Comment puis-je faire ceci?comment faire un regroupement dans LINQ

Dans mon cas également, un produit peut appartenir à deux catégories à la fois. Comment puis-je empêcher LINQ de retourner des doublons? Je ne suis intéressé que par la première catégorie (en fait, peu importe si elle est assignée à ce produit).

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

Si vous ne souhaitez dans la première catégorie, alors pourquoi ne pas simplement ajouter où pc.CategoryId == interestingcategory au lieu de regroupement, puis en rejetant tous les groupes sauf la première? –

+0

quand j'ai dit qu'il y a plus de catégories, je veux dire qu'il y a une relation plusieurs-à-plusieurs entre les produits et les catégories. C'est ainsi que la base de données sur laquelle je travaille est structurée. En fait, je n'utilise qu'une catégorie par produit. –

Répondre

-2

j'ai réussi à le faire comme ceci:

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

Dans ce cas, pourriez-vous avoir giflé un .SelectMany (g => g) .ToList() sur la requête et obtenir la même chose? – Frank

+0

Je pourrais avoir si je savais comment :)) C'était le genre de réponse que je m'attendais: D –

0

Dans votre cas g est IEnumerable donc vous pouvez simplement utiliser select g.First() ou appliquer tout type de filtrage supplémentaire à elle.