实体框架中的多连接查询

时间:2012-10-21 04:54:48

标签: entity-framework join

我有以下表格

任务
id |名字| PROJ_ID
1 | task1 | 1
2 | task2 | 1
3 | task3 | 1

项目
id |命名
1 |样品proj1
2 |演示项目

budget_versions
id | VERSION_NAME | PROJ_ID
1 | 50 | 1

预算
id |费用| budget_version_id | TASK_ID
1 | 3000 | 1 | 2
2 | 5000 | 1 | 1

我需要使用实体框架

连接这些表以获得如下结果

task_id | task_name | project_id | budget_version | budget_id |成本
1 | task1 | 1 | 1 | 2 | 5000
2 | task2 | 1 | 1 | 1 | 3000
3 | task3 | 1 | NULL | NULL | NULL

选择tsk.id,tsk.name,tsk.project_id,bgtver.id,bgt.id,bgt.cost 来自TASK tsk 左外连接BUDG​​ET_VERSIONS bgtver 在tsk.project_id = bgtver.project_id上 左外连接BUDG​​ETS bgt 在bgtver.id = bgt.budget_version_id和tsk.id = bgt.task_id 其中bgtver.id = 1

这是我到目前为止所尝试的

var budgetlists = _worker.Budgets.Get()。GroupJoin(_worker.BudgetVersions.Get(),                                                              rb => rb.budget_version_id,rbv => rbv.id,                                                              (rb,rbrbv)=> new {rb,rbrbv})。SelectMany(                                                                @t => @ t.rbrbv.DefaultIfEmpty())。群组加入(                                                                  _worker.Tasks.Get(),rbrbv => rbrbv.id,tsk => tsk.id,                                                                  (rbrbv,tskrb)=> new {rbrbv,tskrb})。SelectMany(                                                                    @p => @ p.tskrb.DefaultIfEmpty());

1 个答案:

答案 0 :(得分:1)

这应该有效:

var result = from tsk in tasks
                join bv in budget_versions on tsk.proj_id equals bv.proj_id into g1
                from bgtver in g1.DefaultIfEmpty()
                join b in budgets on new { bgtver_id = bgtver.id, tsk.id } equals new { bgtver_id = b.budget_version_id, id = b.task_id } into g2
                from bgt in g2.DefaultIfEmpty()
                select new Result 
                { 
                    task_id = tsk.id, 
                    task_name = tsk.name, 
                    project_id = tsk.proj_id, 
                    budget_version = bgtver.id, 
                    budget_id = bgt == null ? (int?)null : bgt.id, 
                    cost = bgt == null ? (int?)null : bgt.cost 
                };

Here你是如何在LINQ中留下外连接的。