sun*_*der 5 c# linq lambda entity linq-to-sql
我正在尝试获取产品列表及其评级、评论和观点。PID是没有外键关系的产品ID列。
\n\n产品 -
\n\nId Name\n1 P1\n2 P2\nRun Code Online (Sandbox Code Playgroud)\n\n评分 -
\n\nId PID Rating\n1 1 5\n2 1 4\n3 2 3\nRun Code Online (Sandbox Code Playgroud)\n\n评论 -
\n\nId PID Comment\n1 1 Good\n2 1 Average\n3 2 Bad\nRun Code Online (Sandbox Code Playgroud)\n\n意见 -
\n\nId PID View\n1 1 500\n2 1 200\n3 2 10\nRun Code Online (Sandbox Code Playgroud)\n\n我的类看起来像这样 \xe2\x80\x93
\n\nPublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我正在尝试使用 Linq 组连接来获取此信息,以便获得子集合。
\n\nIEnumerable<Product> _products = _context.Product.GroupJoin(_context.Rating, p=>p.id, r=>r.PID, (Product, Rating) => new Product(){\n //fill fields here\n});\nRun Code Online (Sandbox Code Playgroud)\n\n但是如何将其他表分组到单个数据库查询中。
\n\n谢谢
\nGroupJoin您可以直接查找匹配项来构造对象,而不是 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)
| 归档时间: |
|
| 查看次数: |
10456 次 |
| 最近记录: |