外部联接基于LINQ中的DateTime字段,缺少几个月

时间:2013-06-10 12:21:10

标签: c# linq entity-framework

我的问题是如何执行左外连接,但是在linqToEF / SQL中包含基于日期时间字段的缺失值。我正在努力减少一个巨大的问题来询问我的具体问题。

我有3张桌子。想象一下。

  • 时间日志| Id,StartDateTime,AccountNumber,ContractNumber
  • 合同| Id,ContractNumber,AccountNumber,Value,StartDateTime,EndDateTime
  • 帐户| Id,AccountNumber,AccountName,Email,FirstName,LastName

我正在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,即使它没有任何时间日志。

1 个答案:

答案 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