2017-12-08 14 views
0

評価、コメント、および表示とともに製品のリストを取得しようとしています。 PIDは、外部キー関係のない製品ID列です。linqラムダ複数のグループの結合

製品 -

Id Name 
1 P1 
2 P2 

評価 -

Id PID Rating 
1 1 5 
2 1 4 
3 2 3 

コメント -

Id PID Comment 
1 1 Good 
2 1 Average 
3 2 Bad 

ビュー -

Id PID View 
1 1 500 
2 1 200 
3 2 10 

私のクラスには、次のようになります - 私は、LINQのグループを使用してこの情報を得るに参加しようとしています

Public Class Product{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Rating> Ratings{ get; set; } 
    public List<Comments> Comments{ get; set; } 
    public List<Views> Views{ get; set; } 
} 

、私が子供のコレクションを取得するように。

IEnumerable<Product> _products = _context.Product.GroupJoin(_context.Rating, p=>p.id, r=>r.PID, (Product, Rating) => new Product(){ 
    //fill fields here 
}); 

しかし、他のテーブルも単一のデータベースクエリにグループ化する方法。

+0

linq-to-sqlは、変更をコミットするときにクエリを自動的にグループ化します。何を聞いていますか? –

+0

次のようなコードを試してください:IEnumerable _products =(_context.Productのpから) p.idのrを_context.Ratingに結合します。 p.idとs.idの_context.Salesで結合します。 新しい選択 – jdweng

+0

私はクラスで述べたように親子フォーマットにしたいと思っています。それは領域Iです({p = p、r = r、s = s}私が間違っていると私を修正してください。 – sunder

答えて

0

代わりGroupJoin

おかげで、あなただけのProductオブジェクトを構築するために、直接の一致を調べることができますようにコメントで指摘

IEnumerable<Product> _products = _context.Product.Select(product => new Product() { 
    Id = product.id, 
    Name = product.name, 
    Ratings = _context.Rating.Where(r => r.PID == product.id).ToList(), 
    // ... other lists similar 
}); 

、上記のクエリは、三つのサブクエリを生成することができすべての製品についてあなたは匿名のオブジェクトを作成する場合は、中間結果を保持するためにGroupJoinを使用することができます

var _products = _context.Product.GroupJoin(_context.Rating, p => p.id, r => r.PID, (p, rs) => new { p, rs }) 
           .GroupJoin(_context.Comment, prs => prs.p.id, c => c.PID, (prs, cs) => new { prs.p, prs.rs, cs }) 
           .GroupJoin(_context.View, prs => prs.p.id, v => v.PID, (prscs, vs) => new Product() { 
            Id = prscs.p.id, 
            Name = prscs.p.name, 
            Ratings = prscs.rs.ToList(), 
            Comments = prscs.cs.ToList(), 
            Views = vs.ToList() 
           }); 
+0

これは高価な操作である可能性があります。すべての製品について、1つの評価、表示、およびコメントのクエリを起動します。 – sunder

+0

良い私は失望していますが、SQLへのLINQは単一のクエリに変換するほどスマートではありませんか? – NetMage

+0

このグループの結合は機能しますが、LINQPadで生成されたSQLは膨大です。および内部問合せはどちらも同様のSQLを生成します。これは、製品レコードごとに1つの評価、表示、およびコメントのクエリを起動します。 – sunder

0
あなたはこのように試すことができます

 var records = _context.Product 
      .GroupJoin(_context.Ratings, p => p.Id, r => r.PID, (p, r) => new { Product = p, Ratings = r}) 
      .GroupJoin(_context.Comments, p => p.Product.Id, c => c.PID, (p, c) => new { p.Product, p.Ratings, Comments = c}) 
      .GroupJoin(_context.Views, p => p.Product.Id, v => v.PID, (p, v) => new { p.Product, p.Ratings, p.Comments, Views = v }) 
      .Select(p => new 
      { 
       Id = p.Product.Id, 
       Name = p.Product.Name, 
       Comments = p.Comments, 
       Ratings = p.Ratings, 
       Views = p.Views 
      }) 
      .ToList().Select(x => new Product 
      { 
       Id = x.Id, 
       Name = x.Name, 
       Comments = x.Comments.ToList(), 
       Ratings = x.Ratings.ToList(), 
       Views = x.Views.ToList() 
      }).ToList(); 
関連する問題