2009-09-10 5 views
0

Mon exemple de la vie réelle est trop obscure pour expliquer, mais cela est assez bonne approximation une de ce que je suis en train de faire ...Besoin d'aide avec la requête LINQ qui joint deux tables contenant des événements périodiques

Month Table a colonnes: Id, Name

Table Holiday a colonnes: Id, MonthId, DayOfMonth, Name

Table Appointment a colonnes:Comment puis-je produire une liste d'événements uniques (vacances et rendez-vous) classés par mois et jour du mois?

résultats Exemples:

Month Holiday  Day Appointment Day 
---------------------------------------- 
Nov      Fly to NYC 25 
Nov T-Giving 26 
Nov      Fly home  29 
Dec Xmas  25 

Alors, je veux des colonnes séparées pour des vacances et des événements, mais je veux qu'ils soient tous uniques et classés par ordre de mois jour.

Voici ce que j'ai jusqu'à présent (voir commentaires en ligne):

var events = 
    from 
     m in GetMonths() 
    join 
     h in GetHolidays() 
     on m.Id equals h.MonthId 
    join 
     a in GetAppointments() 
     on m.Id equals a.MonthId 
    where 
     //something that narrows all combinations of events to only unique events 
    orderby 
     m.Id, 
     // something that interleaves h.DayOfMonth with m.DayOfMonth 
    select 
     new 
     { 
      Month = m.Name, 
      Holiday = h.Name, 
      HolidayDay = h.DayOfMonth, 
      Appointment = a.Description, 
      AppointmentDay = a.DayOfMonth 
     }; 
+0

Pouvez-vous définir ce que vous entendez par "unique"? Avez-vous le même événement dans la table de rendez-vous plusieurs fois? Voulez-vous seulement un rendez-vous/vacances par jour? – ristonj

+0

Par unique, je veux dire un événement (vacances * ou * rendez-vous) par ligne et aucun événement ne se répète. – devuxer

Répondre

1

Voici une réponse alternative utilisant UNION au lieu d'un LEFT OUTER qui renvoie exactement le jeu de résultats que vous recherchez (je ne pense pas que ma première réponse rencontrerait tout à fait votre "unique" exigence):

var a = from m in month 
     join h in holiday on m.Id equals h.MonthId 
     select new 
     { 
      MonthId = m.Id, 
      Month = m.Name, 
      Holiday = h.Name, 
      HolidayDay = h.DayOfMonth, 
      Appointment = "", 
      AppointmentDay = 0 

     }; 

var b = from m in month 
     join p in appointments on m.Id equals p.MonthId 
     select new 
     { 
      MonthId = m.Id, 
      Month = m.Name, 
      Holiday = "", 
      HolidayDay = 0, 
      Appointment = p.Description, 
      AppointmentDay = p.DayOfMonth 
     }; 

var events = from o in a.Union(b) 
      orderby o.MonthId, o.HolidayDay + o.AppointmentDay 
      select o; 
+0

Exactement ce que je cherchais. Merci! – devuxer

0

Vous devez faire LEFT OUTER se joint à SQL LINQ ressemblerait à quelque chose comme ça (non testé):

var events = 
    from 
     m in GetMonths() 
    groupjoin 
     h in GetHolidays() 
     on m.Id equals h.MonthId 
     into hol = group 
    from 
     h in hol.DefaultIfEmpty() 
    groupjoin 
     a in GetAppointments() 
     on m.Id equals a.MonthId 
     into appt = group 
    from 
     a in appt.DefaultIfEmpty() 
    where 
     //something that narrows all combinations of events to only unique events 
    orderby 
     m.Id, 
     // something that interleaves h.DayOfMonth with m.DayOfMonth 
    select 
     new 
     { 
      Month = m.Name, 
      Holiday = h.Name, 
      HolidayDay = h.DayOfMonth, 
      Appointment = a.Description, 
      AppointmentDay = a.DayOfMonth 
     }; 
Questions connexes