2016-08-09 4 views
0
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 LinqpadLinq внутреннее соединение на сложный запрос

Есть ли способ объединить ниже запросов Linq, и это то, что полезно, как я хочу держать вещи ремонтопригодны. Вышеупомянутое работает в Linqpad с результатамиInner, являющимся Внутренним Присоединением к вновь созданной таблице результатов.

ответ

1

Вы почти находитесь. Просто добавьте дополнительный 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 }; 
+0

Абсолютно отлично, спасибо очень много. Хотел бы я дать вам больше очков за такой полный ответ ... :) –

+0

@AndrewDay - hahaha :) Большое спасибо :) –

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}; 

, связанные с maintainablity нет никакого влияния. Но в этом случае у вас есть лишние прогнозы.

+0

Отлично, и большое спасибо –

Смежные вопросы