Нужна помощь с запросом LINQ, который объединяет две таблицы, содержащие периодические события - PullRequest
0 голосов
/ 10 сентября 2009

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

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

Ответы [ 2 ]

1 голос
/ 11 сентября 2009

Вот альтернативный ответ, использующий 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 голосов
/ 11 сентября 2009

Вам необходимо выполнить 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
        };
...