c# - EF Core 1.0.0 链接 Where 子句

标签 c# sql-server entity-framework asp.net-core entity-framework-core

我有一段代码正在尝试从 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/

相关文章:

sql-server - Mac 上有哪些免费的 SQL Server Management Studio

asp.net - 在 async/await 之前的过去,WebAPI 请求是如何取消的?

c# - 构建动态 LINQ 表达式时如何检测 IsNull/NotNull?

c# - 带委托(delegate)的 QueueUserWorkItem 不起作用,但 WaitCallBack 确实起作用

c# - 粗鲁的代码。 IoC 来拯救

c# - 使用 DotNetZip 设置 Zip 文件的密码

sql-server - SQL Server 查询 - 没有按预期执行,没有像我想象的那样表现

c# - 从两个创建一个数据表

c# - EF 代码首先批量插入

c# - Entity Framework 多重级联删除