我有一段代碼,我正在嘗試從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();

這導致在每個“檔案”“DossierContact”中為每個“Verpleegperiode”調用查詢。由於每個表中有超過50000條記錄,因此它會繼續運行並且永遠不會完成查詢(可能需要數小時......)

在EF6中,這生成了一個查詢,其中包含1中的Where子句,並使用由EF6自動創建的連接和子查詢並且可以工作。

我不確定這是在EF核心中沒有完成的,或者這是我的代碼中的錯誤,這就是為什麼我在提交EF核心Github項目的錯誤之前在SO上問這個問題。

EF中定義的關係:患者1對多檔案,檔案一對一檔案聯繫人,檔案聯繫1對多Verpleegperiodes。

熱門答案

實體框架核心工作有點不同於舊版本。在過去,您的查詢將在一個單一的大查詢中進行翻譯,但使用Core可以將查詢劃分為子查詢,這不是一個壞主意(在SQL Server上,大量連接的大查詢非常昂貴)。

github中有一些類似的bug給你的bug,但你有更複雜的形式。在你的查詢中,EF Core瘋狂並以低效的方式加入。下面給出的查詢稱為XXXXXX次,您可以查看它只使用SQL Profiler或EF Profiler!

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

我希望像這些問題很快得到解決,或者你得到EF團隊的支持,只是發布所有類/實體以防萬一。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因