2012-11-17 2 views
2

J'ai deux tables dans la base de données que je veux sélectionner. Dans l'un d'entre eux, j'ai des événements (Id, start, end, type) et dans l'autre j'ai des Events_before_after où je collectionne les événements liés à certains événements de 'Events' - (Id, EventId, début, fin, type).
J'ai également une liste d'identifiants d'événements par lesquels j'ai besoin de commander les événements dans une requête de sélection.Linq choisir parmi deux tables ordre par liste

C'est ce que j'ai:

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 
} 

Est-il possible de commander aussi le second sélectionner? Je veux dire - est-il un moyen de le commander par eventId qui liens vers «Événements»?

Ce que j'ai besoin est:

event1 
event2 
eventBefore3 
event3 
eventAfter3 

ce que j'ai est:

event1 
event2 
event3 
eventBefore3 
eventAfter3 

Répondre

3

Vous pouvez faire ceci:

//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

Si je votre point essentiel que vous voulez grouper ensemble événements liés sur une touche donnée, les commander, puis les projeter et les aplatir selon un ordre donné de clés .... Si vous voulez faire ça ry ce qui suit:

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