我需要向用户展示一个视图,要显示的信息在不同的表中。
为了简单起见,我在多个请求中获取数据,之后我使用左连接将所有数据粘合在一起。
linq请求看起来像这样:
var operations = _context.Set<Operation>()
.Include(x=>x.Product)
.ToList();
var timeWorks = _context.Set<OperationItem>()
.Where()
.ToList();
var attachments = _context.Set<OperationItem>()
.Where()
.ToList();
var result = operations
.GroupJoin(attachments, o=>o.Id, i=>i.OperationId, (l,r)=> new {Operation = l, Attachment = r})
.SelectMany(x=>x.Attachment.DefaultIfEmpty(), (l,r)=>new {Operation = l.Operation, Attachment = r})
.GroupJoin(timeWorks, o=>o.Operation.OperationId, i=>i.OperationId, (l,r)=> new {Operation = l.Operation, Attachment = l.Attaqchment, TimeWork = r.Sum(_=>_.TimeWork)})
.Select(x=> new OperationList
{
//Собираем окончательное представление
})
.ToList();
一切正常,但我不喜欢每个左连接我都必须遍历前一个连接的结果:
new {Operation = l.Operation, Attachment = l.Attaqchment, TimeWork = r.Sum(_=>_.TimeWork)}
你能告诉我我做错了什么或者有更简单的方法吗?
您可以使用 linq 的内置形式来避免“翻转”——在这种情况下,编译器将自行处理翻转:
但一般来说,left join via group join 是一种技巧,只适用于以 left join 为原生运算符的数据库查询。
对于对象的查询,事情就容易多了!