2011-09-15 5 views
0

J'ai une requête comme ci-dessous. Un produit peut être affecté à plusieurs produits, donc après cette requête Linq, je reçois plusieurs produits dans le résultat. Comment puis-je le modifier pour que je ne puisse voir qu'un seul produit une fois?Linq Query Suggestion

var list = (from p in Products from cat in p.Product_SubCategory_Mappings 
     let trend = CustomFunction(p.ID) where cat.SubCategory.CategoryId == 19 && 
     trend > 100 select new { Product = p, p.Vendor, trend}).ToList(); 

Voici la structure de la table si elle aide

  1. Produits -> ProductID | Nom | Prix ​​| VendorID
  2. Catégorie -> Identification de catégorie | Libellé
  3. Sous-catégorie -> Sous-catégorieID | Label | ParentID
  4. Product_SubCategory_Mapping -> ProductID | SubCategoryID
+3

Par "entreprise multiple" voulez-vous dire "plusieurs fournisseurs"? En outre, pouvez-vous donner une sortie d'échantillon réelle et la sortie d'échantillon souhaitée? Il est difficile de dire ce que vous recherchez (par exemple, voulez-vous interroger en fonction de l'identifiant du fournisseur, de sorte qu'un seul fournisseur est sorti ou simplement grouper par identifiant de fournisseur?) –

+0

Désolé, ses produits ne sont pas commercialisés. –

+0

Il est un peu plus facile de dire ce que vous demandez maintenant que vous avez dit «un produit». Quand je pensais que vous vouliez dire un vendeur, c'était déroutant, et une entreprise n'avait aucun sens :) –

Répondre

2

Lorsque vous effectuez une sous-sélection sur Product.Product_SubCategory_Mappings, vous multipliez le nombre de lignes dans votre jeu de résultats par le nombre d'applications sous-catégorie que vous avez pour chaque produit. Cela signifie que les produits seront dupliqués. Pour éviter cela, vous pouvez use the Any extension method au lieu d'un sous-sélection.

Quelque chose comme ceci:

var list = (from p in Products 
      let trend = CustomFunction(p.ID) 
      let cats = p.Product_SubCategory_Mappings 
      where trend > 100 
       && cats.Any(cat => cat.SubCategory.CategoryId == 19) 
      select new { Product = p, p.Vendor, trend } 
      ) 
      .ToList(); 
+0

A quoi sert le vote? –

+0

Cela ne fonctionne pas. Il montre erreur chats ne contient pas de définition pour tout. –

+1

@Sonesh: Vous devez inclure une instruction 'using' pour la méthode d'extension afin qu'elle soit compilée. Voir: http://msdn.microsoft.com/en-us/library/bb534972.aspx ('using System.Linq') –

1

cela peut être le travail

public IQueryable<Product> GetProduct() 
     { 

      var list = (from p in Products 
         from cat in p.Product_SubCategory_Mappings 
         let trend = CustomFunction(p.ID) 
         where cat.SubCategory.CategoryId == 19 && 
           trend > 100 
         select new {Product = p, p.Vendor, trend}).Distinct(); 
      return list; 
     }