复杂查询的 Linq 内连接
Linq inner join on complex query
var workbasketitems = new[] { //workbasketitems
new { TaskId = 10, WorkGroupId = 100, ActionUserId =1000, Work = "item 0" },
new { TaskId = 11, WorkGroupId = 101, ActionUserId =1001, Work = "item 1" },
new { TaskId = 12, WorkGroupId = 102, ActionUserId =1002, Work = "item 2" }
};
var workflowtasks = new[] { //workflowtasks
new { TaskId = 10, TaskDesc = "TaskDesc 0" },
new { TaskId = 11, TaskDesc = "TaskDesc 1" },
new { TaskId = 12, TaskDesc = "TaskDesc 2" }
};
var workgroup = new[] { //workgroup
new { WorkGroupId = 100, WGDesc = "WGDesc 0" },
new { WorkGroupId = 101, WGDesc = "WGDesc 1" },
new { WorkGroupId = 102, WGDesc = "WGDesc 2" }
};
var applicationuser = new[] { //applicationuser
new { AUId = 1000, AUDesc = "AUId 0" },
new { AUId = 1001, AUDesc = "AUId 1" }
};
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
select new { wft.TaskDesc, wg.WGDesc, wb.ActionUserId, wb.Work};
results.Dump();
var resultsInner = from wb in results
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty()
select new { wb.TaskDesc, wb.WGDesc, Desc = (auList == null? "BlAnk": auList.AUDesc), wb.Work};
resultsInner.Dump();
有没有一种方法可以组合以下 Linq 查询,这对我希望保持可维护性很有帮助。以上在 Linqpad 中有效,resultsInner 是新创建结果的内部连接 table.
你在找这个吗:
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty()
select new { wft.TaskDesc, wg.WGDesc, Desc = (auList == null? "Blank": auList.AUDesc), wb.Work};
与可维护性相关没有影响。但在这种情况下,您省略了额外的投影。
你快到了。只需将您在第二个查询中执行的额外 left join
添加到第一个查询:
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty()
select new { wft.TaskDesc, wg.WGDesc, Desc = (auList == null ? "BlAnk" : auList.AUDesc), wb.Work };
您还可以使用 DefaultIfEmpty
的其他重载来指定在 left join
结果为 null
的情况下要执行的操作:
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty(new { AUId = wb.ActionUserId, AUDesc = "Blank" } )
select new { wft.TaskDesc, wg.WGDesc, Desc = auList.AUDesc, wb.Work };
var workbasketitems = new[] { //workbasketitems
new { TaskId = 10, WorkGroupId = 100, ActionUserId =1000, Work = "item 0" },
new { TaskId = 11, WorkGroupId = 101, ActionUserId =1001, Work = "item 1" },
new { TaskId = 12, WorkGroupId = 102, ActionUserId =1002, Work = "item 2" }
};
var workflowtasks = new[] { //workflowtasks
new { TaskId = 10, TaskDesc = "TaskDesc 0" },
new { TaskId = 11, TaskDesc = "TaskDesc 1" },
new { TaskId = 12, TaskDesc = "TaskDesc 2" }
};
var workgroup = new[] { //workgroup
new { WorkGroupId = 100, WGDesc = "WGDesc 0" },
new { WorkGroupId = 101, WGDesc = "WGDesc 1" },
new { WorkGroupId = 102, WGDesc = "WGDesc 2" }
};
var applicationuser = new[] { //applicationuser
new { AUId = 1000, AUDesc = "AUId 0" },
new { AUId = 1001, AUDesc = "AUId 1" }
};
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
select new { wft.TaskDesc, wg.WGDesc, wb.ActionUserId, wb.Work};
results.Dump();
var resultsInner = from wb in results
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty()
select new { wb.TaskDesc, wb.WGDesc, Desc = (auList == null? "BlAnk": auList.AUDesc), wb.Work};
resultsInner.Dump();
有没有一种方法可以组合以下 Linq 查询,这对我希望保持可维护性很有帮助。以上在 Linqpad 中有效,resultsInner 是新创建结果的内部连接 table.
你在找这个吗:
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty()
select new { wft.TaskDesc, wg.WGDesc, Desc = (auList == null? "Blank": auList.AUDesc), wb.Work};
与可维护性相关没有影响。但在这种情况下,您省略了额外的投影。
你快到了。只需将您在第二个查询中执行的额外 left join
添加到第一个查询:
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty()
select new { wft.TaskDesc, wg.WGDesc, Desc = (auList == null ? "BlAnk" : auList.AUDesc), wb.Work };
您还可以使用 DefaultIfEmpty
的其他重载来指定在 left join
结果为 null
的情况下要执行的操作:
var results = from wb in workbasketitems
join wft in workflowtasks on wb.TaskId equals wft.TaskId
join wg in workgroup on wb.WorkGroupId equals wg.WorkGroupId
join au in applicationuser on wb.ActionUserId equals au.AUId into wbl
from auList in wbl.DefaultIfEmpty(new { AUId = wb.ActionUserId, AUDesc = "Blank" } )
select new { wft.TaskDesc, wg.WGDesc, Desc = auList.AUDesc, wb.Work };