我有一段代码正在尝试从 EF6 移植到 EF 核心(在 ASP.NET 核心 1.0 RTM 项目中)。它会过滤日期时间在“Verpleegperiode”开始日期和结束日期之间的所有患者的患者表,例如 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”的“DossierContact”中的每个“Verpleegperiode”调用一个查询。由于每个表中有超过 50000 条记录,因此继续进行并且永远不会完成查询(可能需要数小时......)
在 EF6 中,这生成了一个查询,其中包含 1 中的 Where 子句并使用了由 EF6 自动创建的连接和子查询并有效。
我不确定这是不是在 EF 核心中没有完成,或者这是我的代码中的一个错误,这就是为什么我在 SO 上提出这个问题之前在 EF 核心 Github 项目上提交错误。
EF 中定义的关系:患者一对多 Dossiers、Dossier 一对一 DossierContact、DossierContact 一对多 Verpleegperiodes。
最佳答案
Entity Framework Core 的工作方式与旧版本略有不同。在过去,您的查询将被翻译成一个单独的大查询,但使用 Core 可以将查询分成多个子查询,这不是一个坏主意(具有大量连接的大查询在 SQL Server 上非常昂贵)。
github 中有一些与您的错误类似的错误,但您的错误形式更复杂。在您的查询中,EF Core 变得疯狂并以低效的方式完全加入。下面给出的查询被调用了 XXXXXX 次,您可以使用 SQL Profiler 或 EF Profiler 来检查它!
SELECT [vp3].[DateTime], [vp3].[PapierId]
FROM [SubPapiers] AS [vp3]
我希望这些问题能尽快得到解决,或者您得到 EF 团队的支持,只需发布所有类/实体以防万一。
关于c# - EF Core 1.0.0 链接 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39248809/