1

私はEF6からEFコア(ASP.NETコア1.0 RTMプロジェクト)に移植しようとしているコードを持っています。これは、 "Verpleegperiode"の開始日と終了日の間に、例えば2015年に "Verpleegperiode"を使用して患者のテーブルをフィルタリングします(私はEF6プロジェクトでこれを使用してWhere句を名前、誕生日、およびフィルタのこれらの種類にフィルタリングするの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(); 

これは、各「ドシエの」「DossierContact」にそれぞれ「Verpleegperiode」のために呼び出されたクエリになり。

EF6では、Where節が1つで、ジョインとサブクエリが自動的に使用されているクエリが生成されました(これはおそらく時間がかかります) EF6によって作成され、働いた。

これはEFコアで終了していないこと、またはこれが私のコードの不具合であるとは確信していません。そのため、EFコアGithubプロジェクトでバグを報告する前にこれを尋ねています。

EFで定義された関係:患者1対多数の書類、1対1の書類DossierContact、DossierContact 1対多のVerpleegperiodes。

答えて

1

エンティティフレームワークコアの動作が少し変わって古いバージョンと違います。過去には、1つの大きなクエリでクエリが変換されますが、コアではクエリがサブクエリに分割されますが、これは悪い考えではありません(SQL Serverではジョインが多い大きなクエリが非常に高価です)。

バグにgithubに類似のバグがいくつかありますが、より複雑な形になっています。あなたのクエリEFコアで狂ったと完全に非効率的な方法で結合します。以下のクエリはXXXXXX回呼ばれます。SQLプロファイラまたはEFプロファイラを使用するだけでチェックアウトできます。

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

私はこれらの問題がすぐに解決されることを願っています。または、EFチームからサポートを受けることができます。

+0

私はGithubにバグとして提出しました:https://github.com/aspnet/EntityFramework/issues/6448 – AppSum

+0

@AppSum最新バージョンを入手してビルドします。バグを再現するために再試行してください。問題が本当に修正されている場合は、メモを追加してこの回答を確認してください。 –