在.NET Core中管理公司内部审计过程的C#应用程序中,我有两个数据集Expert
和Employee
属于_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
,我也想要获取Internal
,Name
和Surname
Address
最高。
第一步是EndDate
和left 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 }},其中GROUPBY
是Internal
。
我试图通过打开适当的日志级别(我使用.NET Core)来检查已执行的SQL,但是由于它引发了异常,因此不会显示所创建的查询。
这种解释似乎有些不合逻辑,还有其他人更好吗?