2017-09-26 1 views
1

테이블의 두 번째 부분을 필터링하려고합니다 (UserRoles.IsDeleted == false). 내가 그걸 어떻게 할 수 있는지 조언이 있니? Linq - Eager 선택을 걸러 내려고 시도합니다.

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

는 프로젝션을하는 관련 기관

를 필터링 할 수있는 두 가지 옵션이 있습니다. 불행히도 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)}) 

두 번째 옵션은 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에 왕복을 할 것 때문에 정말 비효율적이 될 것 각 엔티티 당. 내 충고는 첫 번째 옵션을 사용하여 쿼리를 투영하는 것입니다.

관련 문제