0

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

我有 3 张桌子。在下面画出它们。

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

我在 linq 中执行一个 group by 是这样的:

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

4

1 回答 1

0

您不能加入本地列表,但您可以在本地列表中使用 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)

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

于 2013-06-11T03:26:49.103 回答