[英]Need help with LINQ query that joins two tables containing periodic events
我的現實生活中的例子太晦澀難解,無法解釋,但這與我正在嘗試做的非常相似...
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
};
這是一個使用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;
您需要在SQL中進行LEFT OUTER連接,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
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.