基于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,即使它没有任何时间日志。
你不能在本地列表上连接,但你可以在本地列表上使用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)
我还是觉得这样做有点恶心