linq lambda 多个组连接

sun*_*der 5 c# linq lambda entity linq-to-sql

我正在尝试获取产品列表及其评级、评论和观点。PID是没有外键关系的产品ID列。

\n\n

产品 -

\n\n
Id  Name\n1   P1\n2   P2\n
Run Code Online (Sandbox Code Playgroud)\n\n

评分 -

\n\n
Id  PID Rating\n1   1   5\n2   1   4\n3   2   3\n
Run Code Online (Sandbox Code Playgroud)\n\n

评论 -

\n\n
Id  PID Comment\n1   1   Good\n2   1   Average\n3   2   Bad\n
Run Code Online (Sandbox Code Playgroud)\n\n

意见 -

\n\n
Id  PID View\n1   1   500\n2   1   200\n3   2   10\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的类看起来像这样 \xe2\x80\x93

\n\n
Public Class Product{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public List<Rating> Ratings{ get; set; }\n    public List<Comments> Comments{ get; set; }\n    public List<Views> Views{ get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在尝试使用 Linq 组连接来获取此信息,以便获得子集合。

\n\n
IEnumerable<Product> _products = _context.Product.GroupJoin(_context.Rating, p=>p.id, r=>r.PID, (Product, Rating) => new Product(){\n    //fill fields here\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是如何将其他表分组到单个数据库查询中。

\n\n

谢谢

\n

Net*_*age 3

GroupJoin您可以直接查找匹配项来构造对象,而不是 a 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
});
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的,上述查询可以为每个产品生成三个子查询。

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()
                                });
Run Code Online (Sandbox Code Playgroud)