2011-09-15 3 views
0

以下のような質問があります。製品を複数の製品に割り当てることができるので、このlinqクエリの結果、複数の製品が得られます。 1つの製品を1回しか見ることができないように、どうすれば変更できますか?ここで 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
  2. カテゴリ - >カテゴリID |ラベル
  3. サブカテゴリ - >サブカテゴリID |ラベル| ParentID
  4. Product_SubCategory_Mapping - > ProductID | SubCategoryID
+3

かもしれあなたは、 "複数のベンダーを" 意味ですか?また、実際のサンプル出力と希望のサンプル出力を与えることができますか? (ベンダーIDに基づいてクエリを行い、単一のベンダーのみが出力されるようにするか、ベンダーIDごとにグループ化するなど)あなたが探しているものを伝えるのは難しいです。 –

+0

その製品はビジネスではありません。 –

+0

「1つの製品」と言いましたが、あなたが今質問していることを言うのが少し簡単です。私があなたが1つのベンダーを意味すると思ったとき、それは混乱していました。そして、1つのビジネスは全く意味をなさないでしょう:) –

答えて

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

これは機能しません。 catにAnyの定義が含まれていないというエラーが表示されます。 –

+1

@Sonesh:拡張メソッドに 'using'ステートメントを含めてコンパイルする必要があります。参照してください:http://msdn.microsoft.com/en-us/library/bb534972.aspx( 'using 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; 
     }