代码之家  ›  专栏  ›  技术社区  ›  devuxer

需要有关连接两个包含周期性事件的表的LINQ查询的帮助

  •  0
  • devuxer  · 技术社区  · 16 年前

    Month 表有列: Id , Name

    Holiday 表有列: ID , MonthId , DayOfMonth , 名字

    Appointment 表有列: ID , , 每月几天 , 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 回复  |  直到 16 年前
        1
  •  1
  •   Scrappydog    16 年前

    这是一个使用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;
    
        2
  •  0
  •   Scrappydog    16 年前

    你需要在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
            };