基于LINQ中的DateTime字段的外连接,缺少月份

本文关键字:连接 中的 LINQ DateTime 字段 基于 | 更新日期: 2023-09-27 18:17:37

我的问题是如何在linqToEF/SQL中执行左外连接,但要包含基于datetime字段的缺失值。我想把一个大问题简化成一个具体的问题。

我有3张表。

  • 时间日志| Id, StartDateTime, AccountNumber, ContractNumber
  • 合同| Id, ContractNumber, AccountNumber, Value, StartDateTime, EndDateTime
  • accounts | 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

时间日志表只包含一个月来使用特定帐户提交的时间日志。如果没有提交时间日志,它将不会输出任何条目,正如我所期望的那样。

请看下面的例子:

帐户"Blah"没有提交第5个月的任何时间日志。因此,在下面的示例输出中缺少for 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

我如何执行连接在linq到SQL/实体框架,基于缺少月/年从DateTime字段?我想包含第5个月的Blah,即使它没有任何时间日志。

基于LINQ中的DateTime字段的外连接,缺少月份

你不能在本地列表上连接,但你可以在本地列表上使用Contains(它们作为参数传递,所以要小心列表中的项目数量…)

你可以试试

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)

我还是觉得这样做有点恶心