web-dev-qa-db-ja.com

.NET Core 3.0 Entity Frameworkでグループ参加を実行するにはどうすればよいですか?

.NET Core 3.0の変更により、

... NavigationExpandingExpressionVisitor 'が失敗しました。これは、EF Coreのバグまたは制限を示している可能性があります。詳細については https://go.Microsoft.com/fwlink/?linkid=21014 を参照してください。)---> System.InvalidOperationException:LINQ式 'GroupJoin、...の処理.

これは非常に単純なクエリなので、.NET CORE 3.0で実行する方法が必要です。

 var queryResults1 = await patients
            .GroupJoin(
                _context.Studies,
                p => p.Id,
                s => s.Patient.Id,
                (p, studies) => new 
                {
                    p.DateOfBirth,
                    p.Id,
                    p.Name,
                    p.Sex,
                   Studies =studies.Select(s1=>s1)
                }
            )
            .AsNoTracking().ToListAsync();

私は基本的に、Studyを患者に結合するLinqクエリ(または上記のメソッド構文)を探しており、Studyを空のリストに設定するか、特定の患者のスタディがない場合はnullを設定します。

何か案は?これは.NET Core 2.2で機能していました。また、上記のMSFTリンクは、重要な変更がクライアント側の評価に関連しており、生成されたクエリがテーブル全体を読み取ることを回避していることを示しています。ただし、この単純なクエリでは、結合はサーバー側で簡単に実行できるはずです。

12
shelbypereira

まったく同じ問題があり、大きな苦労がありました。 .net Core 3.0は、メソッド構文で(まだ?)JoinまたはGroupjoinをサポートしていないことがわかります。楽しい部分ですが、クエリ構文で機能します。

これを試してみてください。これは、メソッド構文のビットを含むクエリ構文です。これは、Niceの左外部結合を持つ正しいSQLクエリにうまく変換され、データベースで処理されます。私はあなたのモデルを持っていないので、自分で構文をチェックする必要があります...

var queryResults1 = 
    (from p in _context.patients
    from s in _context.Studies.Where(st => st.PatientId == p.Id).DefaultIfEmpty()
    select new
    {
        p.DateOfBirth,
        p.Id,
        p.Name,
        p.Sex,
        Studies = studies.Select(s1 => s1)
    }).ToListAsync();
0
hwmaat