复杂查询的 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 };