我有以下表格
任务
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 左外连接BUDGET_VERSIONS bgtver 在tsk.project_id = bgtver.project_id上 左外连接BUDGETS 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());
答案 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中留下外连接的。