Linq内部连接复杂查询

时间:2016-08-09 08:30:07

标签: c# mysql linq linqpad

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();

Results from Linqpad

有没有办法结合下面的Linq查询,这是有用的,因为我想保持可维护的东西。以上工作在Linqpad中,resultsInner是新创建的结果表的内部连接。

2 个答案:

答案 0 :(得分:2)

你快到了。只需将您在第二个查询中执行的额外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 };

答案 1 :(得分: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
    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};

与维护相关无影响。但在这种情况下,你已经有了额外的预测。