1

我有一段代碼,我想從港口到EF6 EF核心(在ASP.NET 1.0的核心項目RTM)。它可以過濾患者表在2015年(我用這個在我EF6項目通過添加Where子句的創建動態篩選所有患者用「Verpleegperiode」開始日期和結束日期以「Verpleegperiode」之間例如日期時間IQueryable的對象,要過濾的姓名,出生日期,以及這些類型的過濾器)EF核心1.0.0鏈接Where子句

代碼:

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(); 

這將導致一個查詢中呼籲各「Verpleegperiode」中的每個「檔案」的「DossierContact」 。由於每個表中有超過50000條記錄,因此這種情況會持續進行,並且永遠不會完成查詢(可能需要幾個小時...)

在EF6中,這會生成一個查詢,其中包含Where子句以及使用連接和子查詢由EF6創建並開展工作。

我不確定這是EF核心中沒有完成的東西,還是這是我的代碼中的錯誤,這就是爲什麼我在提出EF核心Github項目錯誤之前就問這個問題。

在EF中定義的關係:病人一對多檔案,檔案一對一DossierContact,檔案接觸一對多Verpleegperiode。

回答

1

實體框架的核心工作一點兒的不同,那麼舊版本。在過去,您的查詢將被翻譯成一個單一的大查詢,但對於Core而言,查詢可以分爲子查詢,這並不是一個壞主意(SQL Server上有很多連接的大查詢非常昂貴)。

有在github上到你的錯誤一些類似的錯誤,但你在更復雜的形式得到了它。在您的查詢EF核心發瘋,並以一種低效率的方式完全加入。下面給出的查詢稱爲XXXXXX次,您可以使用SQL Profiler或EF Profiler查看它!

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

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

+0

我提起它在Github上的錯誤:https://github.com/aspnet/EntityFramework/issues/6448 – AppSum

+0

@AppSum獲得最新版本,並建立它。重試重現該錯誤。如果問題確實解決了,那麼添加你的筆記並檢查這個答案。 –