2017-11-02 2 views
1

私はEntity Frameworkのコアは複数のクエリを実行して、このデータをフェッチしているEntity Frameworkコアでオブジェクトグラフをロードするにはどうすればよいですか?

from user in Users 
    .Include("UserCategoryPermissions") 
    .Include("UserResourcePermissions") 
    .Include("UserPermissions.Permission.Application") 
    .Include("UserGroupMembers.UserGroup.UserGroupPermissions.Permission.Application") 
where user.Id == 3 

をフェッチする必要があるいくつかのリレーショナル・データを持っています。私がやりたいことは、オブジェクトグラフをメモリにロードすることです(投影はしません)。そして、複数のクエリは本当に遅くなるでしょう。私はたくさんで大規模なクエリを実行して、これらのオブジェクトを事前に読み込むことができ

from a in A 
join b in B on a.Id equals b.A_Id into bJoin from b in bJoin.DefaultIfEmpty() 
join c in C on b.Id equals c.B_Id into cJoin from c in cJoin.DefaultIfEmpty() 
join x in X on a.Id equals x.A_Id into xJoin from x in xJoin.DefaultIfEmpty() 
// etc 
select new { 
    a, b, c, x 
} 

に参加するしかし、私はデータをフェッチするたびに本当の痛みになり、これを行うために持ちます。 Entity Framework Coreにデータグラフをプリロードする方法がありますか?理想的には、各文字列がパスを識別する(上記のように)文字列の配列から作業するのが理想的ですが、これらのグラフをパラメータを使用してメソッドに渡すことができます。

+1

これはEFが今実装した方法です。しかし、あまりに簡単に結論を出して1つのコールがより良い結果を出すようにしないでください。 EF6(常に1つの呼び出し)には、クエリの処理速度が大幅に低下する傾向があります。 –

+0

@ GertArnold私は、6つのクエリに対して250-300msの違いが見られます。 –

+1

これはかなり説得力があります:)私は彼らがそれに取り組んでいることを知っていますが、私は現在問題番号を見つけることができません。 –

答えて

0

私は通常、ラムダ構文を使用したい、それが1回の呼び出しですべてのデータをフェッチ:

using System.Linq; 
using Microsoft.EntityFrameworkCore; 
... 

var userFound = context.Users 
    .Include(user => user.UserCategoryPermissions) 
    .Include(user => user.UserResourcePermissions) 
    .Include(user => user.UserPermissions) 
    .ThenInclude(map => map.Permission) 
    .ThenInclude(permission => permission.Application) 
    .Include(user => user.UserGroupMembers) 
    .ThenInclude(members => members.UserGroup) 
    .ThenInclude(group => group.UserGroupPermissions) 
    .ThenInclude(map => map.Permissions) 
    .ThenInclude(permission => permission.Application) 
    .Where(user => user.Id == 3); 

IncludeThenIncludeインテリセンスのラムダ以内に正常に動作しないことに注意してください。単にブラインドで正しいプロパティ名を入力すると、それが機能します。

+1

これは何の違いもありませんが、同じ効果を達成する別の構文に過ぎません。 EF-coreはIncludesの複数のクエリを実行するだけです。 –

+0

いいえ、これは、すべてのインクルードに対して追加のクエリを生成します –

関連する問題