2017-09-26 5 views
1

テーブルの2番目の部分をフィルタリングしようとしています(UserRoles.IsDeleted == false)。どのように私はそれを行うことができますアドバイスはありますか?Linq - Eager Selectionをフィルタリングしようとしています

var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>(); 
Users = context.Users.Include(x => x.UserRoles.Select(y=>y.IsDeleted==false)).ToList(); 

あなたは第二部を使用してフィルタリングするために次の操作を行うことができますあなたの

+0

あなたが達成しようとしていることが正確ではありません。遅延ロードを無効にすることができます(問題がある場合)。または、達成しようとしている場合は、UserRolesに参加できます。 – BurnsBA

答えて

0

ありがとう:

var Users = context.Users.Where(r => r.IsDeleted == IsDeleted).ToList<User>(); 

if(condition) 
{ 
    Users = Users.where(y => y.IsDeleted == false)).ToList(); 
} 
0

投影を行う関連企業

をフィルタリングするための2つのオプションがありますが。 残念ながら、Includeメソッドを使用すると、意図したとおりに関連エンティティをフィルタリングできません。以下の例のように、クエリをDTOオブジェクトまたは匿名オブジェクトに投影する必要があります。

var query=context.Users.Include(x => x.UserRoles) 
         .Where(r => r.IsDeleted == IsDeleted) 
         .Select(u=> new{ ..., 
             Roles=x => x.UserRoles.Where(y=>!y.IsDeleted)}) 

2番目のオプションはExplicitly Loadingです。しかし、これはある特定のエンティティの関連エンティティ、たとえば、を読み込むことができる場合です。

var user=context.Users.FirstOrDefault(r.IsDeleted == IsDeleted);//Getting a user 

context.Entry(user) 
     .Collection(b => b.UserRoles) 
     .Query() 
     .Where(y=>!y.IsDeleted) 
     .Load(); 
あなたが最初のクエリから取得した各エンティティごとのforeachのこの内部を行うことができます

var query=context.Users.Where(r => r.IsDeleted == IsDeleted); 
foreach(var u in query) 
{ 
    context.Entry(u) 
     .Collection(b => b.UserRoles) 
     .Query() 
     .Where(y=>!y.IsDeleted) 
     .Load(); 

} 

あなたがあなたのDBへの往復をするつもりされているので、本当に非効率的になるだろう各エンティティごとに私のアドバイスは、最初のオプションを使用して、クエリを投影しています。

関連する問題