我的问题是如何执行左外连接,但是在linqToEF / SQL中包含基于日期时间字段的缺失值。我正在努力减少一个巨大的问题来询问我的具体问题。
我有3张桌子。想象一下。
我正在linq中执行这样的小组:
group new {contracts, timelogs} by new { accounts.AccountNumber, accounts.AccountName, Year = timelogs.StartDateTime.Year, Month = timelogs.StartDateTime.Month } into g
timelogs表仅包含已使用特定帐户提交一个月的时间日志。如果没有提交时间日志,它将不会像我期望的那样输出任何条目。
见这个例子:
帐户“Blah”没有为第5个月提交任何时间日志。因此,在下面的示例输出中缺少Blah条目。
AccountName | Account Number | Month | Year
Bling 654321 5 2013
Bling 654321 6 2013
Blah 123456 6 2013
Bling 654321 7 2013
Blah 123456 7 2013
Bling 654321 8 2013
Blah 123456 8 2013
我试过这样做,但是,由于数组是本地的,这不起作用。
join months in new int[] { 1,2,3,4,5,6,7,8,9,10,11,12 } on timelogs.StartDateTime.Month equals months
join years in new int[] { 2008,2009,2010,2011,2012,2013,2014,2015,2016 } on timelogs.StartDateTime.Year equals months
如何根据DateTime字段中缺少的月/年,在linq到SQL /实体框架中执行连接?我希望包括第5个月的Blah,即使它没有任何时间日志。
答案 0 :(得分:0)
您无法加入本地列表,但您可以在本地列表中使用包含(它们作为参数传递,因此请注意列表中的项目数...)
你可以尝试做
group new {contracts, timelogs} by new { accounts.AccountNumber, accounts.AccountName, Year = timelogs.StartDateTime.Year, Month = timelogs.StartDateTime.Month } into g
where new int[] { 1,2,3,4,5,6,7,8,9,10,11,12 }.Contains(g.Month)
&& new int[] { 2008,2009,2010,2011,2012,2013,2014,2015,2016 }.Contains(g.Year)
我仍然觉得这样做有点icky