我有一段代码,我正在尝试从EF6移植到EF核心(在ASP.NET核心1.0 RTM项目中)。它过滤了所有患者的患者表,其日期时间介于“Verpleegperiode”startdate和enddate之间,例如2015年的“Verpleegperiode”。(我在我的EF6项目中使用它来创建动态过滤器,通过添加Where子句到IQueryable对象,过滤名称,生日和这些过滤器)
代码:
var datetime = DateTime.Parse("5/7/2015");
var patients = _context.Patienten.Include(p => p.Dossiers).ThenInclude(d => d.DossierContact).ThenInclude(dc => dc.Verpleegperiodes)
.Where(p =>
p.Dossiers.Any(d =>
d.DossierContact.Verpleegperiodes.Any(vp =>
(!vp.BeginDatumUur.HasValue || vp.BeginDatumUur.Value <= datetime) &&
(!vp.BeginDatumUur.HasValue || vp.EindDatumUur >= datetime))
))
.Where(p =>
p.Dossiers.Any(d => d.DossierContact == null ||
d.DossierContact.Verpleegperiodes.Any(vp =>
!vp.BeginDatumUur.HasValue || vp.BeginDatumUur.Value.Year.ToString() == "2015")
)).ToList();
这导致在每个“Dossier's”“DossierContact”中为每个“Verpleegperiode”调用查询。由于每个表中有超过50000条记录,因此它会继续运行并且永远不会完成查询(可能需要数小时......)
在EF6中,这生成了一个查询,其中包含1中的Where子句,并使用由EF6自动创建的连接和子查询并工作。
我不确定这是在EF核心中没有完成的,或者这是我的代码中的错误,这就是为什么我在提交EF核心Github项目的错误之前在SO上问这个。< / p>
EF中定义的关系:患者1对多档案,档案一对一档案联系人,档案联系1对多Verpleegperiodes。
答案 0 :(得分:1)
实体框架核心工作有点不同于旧版本。在过去,您的查询将在一个单一的大查询中进行转换,但使用Core可以将查询划分为子查询,这不是一个坏主意(在SQL Server上,大量连接的大查询非常昂贵)。
github中存在一些类似的错误,但你的错误形式是你的错误。在您的查询中,EF Core疯狂并以低效的方式加入。下面给出的查询称为XXXXXX次,您可以查看它只使用SQL Profiler或EF Profiler!
SELECT [vp3].[DateTime], [vp3].[PapierId]
FROM [SubPapiers] AS [vp3]
我希望像这些问题很快得到解决,或者你得到EF团队的支持,只是发布所有课程/实体。