2011-09-15 64 views
0

我有如下查詢。一個產品可以被分配到多個產品,所以在這個linq查詢之後,我得到了多個產品。我如何改變它,以便我只能看到一個產品一次。Linq查詢意見

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(); 

這裏是表結構,如果有幫助

  1. 產品 - >產品ID |名稱|價格| VendorID
  2. 分類 - > CategoryID |標籤
  3. 子類別 - >子類別ID |標籤| ParentID
  4. Product_SubCategory_Mapping - > ProductID | SubCategoryID
+3

通過 「多業務」 你的意思是 「多個供應商」?另外,您可以給出一些實際的樣本輸出和所需的樣本輸出?很難告訴你在找什麼(例如,你想根據供應商ID進行查詢,以便只輸出一個供應商或僅供應商組ID) –

+0

對不起,它的產品沒有業務。 –

+0

告訴你現在要問你說的是「一種產品」比較容易一點。當我認爲你的意思是一個供應商時,這是令人困惑的,一個企業根本沒有任何意義:) –

回答

2

當您在結果由您爲每個產品子類的映射數設置做行的子選擇上Product.Product_SubCategory_Mappings,你是乘以數量。這意味着產品將被複制。

爲了避免這種情況,您可以使用use the Any extension method而不是子選擇。

事情是這樣的:

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

什麼是反對票? –

+0

這不起作用。它顯示錯誤貓不包含Any的定義。 –

+1

@Sonesh:你必須在擴展方法中包含'using'語句才能編譯。請參閱:http://msdn.microsoft.com/en-us/library/bb534972.aspx('使用System.Linq') –

1

這可能是工作

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; 
     }