2012-11-17 2 views
2

DB에서 선택할 테이블이 두 개 있습니다. 그들 중 하나의 '이벤트'에서 나는 이벤트 (ID, 시작, 종료, 유형)가 있고 다른 이벤트에서 '이벤트'의 일부 이벤트와 연결된 이벤트를 수집하는 'Events_before_after'가 있습니다 - (Id, EventId, 시작, 종료, 유형).
또한 Select 쿼리에서 이벤트를 정렬해야하는 이벤트 ID 목록이 있습니다.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 
} 

가 선택 또한 두 번째 주문 할 수 있습니까? 내 말은 - '이벤트'에 연결되는 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

당신이 함께 그룹화 할 관련 키 이벤트를 생성 한 다음 키 순서대로 투영하고 병합합니다. 다음과 같이 입력하십시오 :

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