2009-09-10 3 views
0

Моего реального примера слишком неясный, чтобы объяснить, но это довольно хорошее приближение того, что я пытаюсь сделать ...Нужна помощь с LINQ запросом, который соединяет две таблицы, содержащую периодические события

Month стола имеет столбцы: Id, Name

Holiday таблица имеет столбцы: Id, MonthId, DayOfMonth, Name

Appointment таблица имеет столбцы: Id, MonthId, DayOfMonth, Description

Как получить список уникальных событий (праздники и назначений) заказанных месяц и день месяца?

Примеры результатов:

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

Итак, я хочу отдельные столбцы для праздников и событий, но я хочу, чтобы все они были уникальными и перечислены в порядке месяц-день.

Вот что я до сих пор (см инлайн комментарии):

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

Можете ли вы определить, что вы подразумеваете под «уникальным»? У вас одно и то же событие в таблице назначения несколько раз? Вам нужна только одна встреча/отпуск в день? – ristonj

+0

Уникальным я имею в виду одно событие (праздник * или * назначение) в строке, и никакое событие никогда не повторяется. – devuxer

ответ

1

Ниже приведен альтернативный ответ с использованием UNION вместо LEFT OUTER, который возвращает точно результат, который вы ищете (я не думаю, что мой первый ответ вполне соответствовал бы вашему «уникальному» требованию):

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

Именно то, что я искал. Благодаря! – devuxer

0

Вам нужно сделать LEFT OUTER присоединяется к SQL LINQ будет выглядеть примерно так (непроверенный):

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 
     }; 
Смежные вопросы