2015-04-15 3 views
1

Мне нужно связать ближайшее действие (если оно есть) с каждым узлом. Запрос SQL пыльник сделать это для меня:Каскадное левое соединение в LINQ

select n.*, o.* from Nodes n 
left outer join (
    select min(s.ActionAt) as ActionAt, min(s.Ahead) as Ahead, s.NodeId 
    from SuggestedActions s 
    group by s.NodeId 
) o1 
    on o1.NodeId=n.Id 
left outer join SuggestedActions o 
    on o.NodeId=o1.NodeId and o.ActionAt=o1.ActionAt and o.Ahead=o1.Ahead 

Но я не в состоянии сформулировать тот же запрос с использованием LINQ. Я оставил присоединиться, который выбирает ближайшие действия, и я не знаю, как продолжать присоединение больше данных:

from node in db.Nodes 
join no in db.SuggestedActions on node.Id equals no.NodeId into no1 
from o1 in no1.DefaultIfEmpty() 
group o1 by node.Id into go1 
select new { 
    NodeId = go1.Key, 
    ActionAt = go1.Min(c => c.ActionAt), 
    Ahead = go1.Min(c => c.Ahead) 
} ... 

ответ

1

попробовать с этим, он не проверял, но могу дать вам направление:

var nodeActions = from node in db.Nodes 
    join action in db.SuggestedActions on node.Id equals action.NodeId into actions 
    from action in actions.DefaultIfEmpty() 
    select new { node, action }; 

var minNodes = from nodeAction in nodeActions 
    group nodeAction by nodeAction.node.Id 
    into groupedActions 
    select new 
    { 
     NodeId = groupedActions.Key, 
     ActionAt = groupedActions.Min(c => c.action.ActionAt), 
     Ahead = groupedActions.Min(c => c.action.Ahead) 
    }; 

var result = from minNode in minNodes 
    join nodeAction in nodeActions on new { Id = minNode.NodeId, minNode.ActionAt, minNode.Ahead } 
     equals new { nodeAction.node.Id, nodeAction.action.ActionAt, nodeAction.action.Ahead } into nodeActionJ 
    from action in nodeActionJ 
    select action; 
+0

Спасибо за идею: я не знал, что могу разделить запрос LINQ на несколько IQueryables, а EF выдает одну команду SQL. пф – pf1957

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