为什么在LINQ中在GroupBy之后执行Where子句?

时间:2019-02-08 16:14:29

标签: c# linq tsql lambda group-by

在.NET Core中管理公司内部审计过程的C#应用​​程序中,我有两个数据集ExpertEmployee属于_context

  • Employee是指公司内部的所有人员,因此 他们得到了公司标识符Cid。在Employee中,可能有几条具有相同Cid的记录,但是通过StartDate-EndDate的时间间隔可以确定记录的有效性。
  • Expert可能同时引用Employee(设置为Internal的{​​{1}}标志和公司外部人员,因此并非true中的所有记录有一个Expert。并非每个Cid都是Employee

数据集的建模如下:

Expert

我想获取包含所有class Employee{ public int Cid { get; set;} public string Name { get; set;} public string Surname { get; set;} public string Address { get; set;} public DateTime StartDate{ get; set;} public DateTime EndDate{ get; set;} } class Expert{ public int Id { get; set;} public bool Internal { get; set;} public int Cid { get; set;} } 的列表,对于那些Experts,我也想要获取InternalNameSurname Address最高。

第一步是EndDateleft join之间的Expert

Employee

然后,我仅过滤var experts = from exp in _context.Expert join emp in _context.Employee on exp.Cid equals emp.Cid into experts from expertsDetail in experts.DefaultIfEmpty() select new { emp.Cid, emp.Name, emp.Surname, emp.Address, emp.StartDate, emp.EndDate, exp.Internal }; 的那些记录,然后按Internal进行分组。然后,在任何分组中,我都找到了最大日期,以便用来在Cid

中选择正确的Internal记录
experts

上面代码中的第一条指令抛出Dictionary<string, DateTime> expertsByCid = experts.Where(e => e.Internal) .GroupBy(e => e.Cid) .ToDictionary(e => e.Key, e => e.Max(t => t.EndDate)); experts.Where(e => e.Internal ? e.EndDate == expertsByCid[e.Cid] : true); 。 对此同样适用:

NullReferenceException

相反,如果我使用这个:

Dictionary<string, DateTime> expertsByCid = (from expert in (from expert in experts where expert.Internal select expert)
group expert by expert.Cid).ToDictionary(e => e.Key, e => e.Max(t => t.EndDate));

代码被成功执行,我得到了预期的结果。可能在第一个版本中,当Dictionary<string, DateTime> expertsByCid = experts.Where(e => e.Internal) .ToList() .GroupBy(e => e.Cid) .ToDictionary(e => e.Key, e => e.Max(t => t.EndDate)); 将查询转换为LINQ时,SQL子句在WHERE之后执行,因此它也将非{{1 }},其中GROUPBYInternal

我试图通过打开适当的日志级别(我使用.NET Core)来检查已执行的SQL,但是由于它引发了异常,因此不会显示所创建的查询。

这种解释似乎有些不合逻辑,还有其他人更好吗?

0 个答案:

没有答案