2012-11-17 58 views
2

我有兩個我想從中選擇的DB表。在其中的一個'活動'中,我有事件(Id,開始,結束,類型),另一個是'Events_before_after',我收集與'Events'中的一些事件相關的事件 - (Id,EventId,開始,結束,鍵入)。
我還有一個事件id的列表,我需要在select查詢中對事件進行排序。Linq從兩個表中按列表順序選擇

這是我有:

List<int> orderIds = ... 

from order in orderIds 
join event in events order on order equals event.id 
select new DataEvent() 
{ 
    eventId = event.Id, 
    start = event.start, 
    end = event.end, 
    type = event.type 
}).Concat 
from eventOther in Events_before_after 
select new DataEvent() 
{ 
    eventId = eventOther.Id, 
    start = eventOther.start, 
    end = eventOther.end, 
    type = eventOther.type 
} 

是否有可能也是第二訂購選擇?我的意思是 - 有沒有辦法通過鏈接到'Events'的eventId來訂購它?

我需要的是:

event1 
event2 
eventBefore3 
event3 
eventAfter3 

我有什麼是:

event1 
event2 
event3 
eventBefore3 
eventAfter3 

回答

3

你可以這樣做:

//your query 
... 
from eventOther in Events_before_after 
select new DataEvent() 
{ 
    eventId = eventOther.Id, 
    start = eventOther.start, 
    end = eventOther.end, 
    type = eventOther.type 
} 
into NewEvent 
order by NewEvent.eventId 
select NewEvent; 
2

如果我得到你的要點要組在一起在一個給定的鍵上進行相關的事件,對它們進行排序,然後沿着鍵的給定順序對它們進行投影和拼合....如果你想這樣做ry以下:

var orderedEvents = orderIds.Join(
        //Construct Groups 
        events.GroupBy(e => e.Id) 
          .GroupJoin(Events_before_after, 
             g => g.Key, 
             e => e.EventId, 
             (gEvent, gEventBA) => new { Key = gEvent.Key, 
             EventGroup = 
             gEvent.Select(e => new DataEvent() 
                { 
                 eventId = e.Id, 
                 start = e.start, 
                 end = e.end, 
                 type = e.type 
                }) 
               .Concat(gEventBA.Select(e => new DataEvent() 
                   { 
                   eventId = e.Id, 
                   start = e.start, 
                   end = e.end, 
                   type = e.type 
                   })) 
               .OrderBy(e => e.eventId)), 
         //Project along keys 
         o => o, 
         anon => anon.Key, 
         (o,anon) => anon.EventGroup) 
         //Flatten groups 
          .SelectMany(g => g);