EF Core 1.0.0链接Where子句

时间:2016-08-31 11:47:30

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

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

1 个答案:

答案 0 :(得分:1)

实体框架核心工作有点不同于旧版本。在过去,您的查询将在一个单一的大查询中进行转换,但使用Core可以将查询划分为子查询,这不是一个坏主意(在SQL Server上,大量连接的大查询非常昂贵)。

github中存在一些类似的错误,但你的错误形式是你的错误。在您的查询中,EF Core疯狂并以低效的方式加入。下面给出的查询称为XXXXXX次,您可以查看它只使用SQL Profiler或EF Profiler!

SELECT [vp3].[DateTime], [vp3].[PapierId]
FROM [SubPapiers] AS [vp3]

我希望像这些问题很快得到解决,或者你得到EF团队的支持,只是发布所有课程/实体。