2017-11-24 14 views
1

탐색 속성이 Settings이고 읽기 전용 속성이 IsVisibleInAppUser 클래스가 있습니다.Entity Framework 핵심 LINQ 클래스 속성/메서드를 사용할 수 없습니다. 포함 된 속성

var users = context.Users.Include(x => x.Settings) 
    .Where(x => x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2); 

하지만 자주 이러한 검사를 사용하는, 그래서 내가 속성을 사용하려고하며 런타임에 널 (null)로 Settings을 가져옵니다

현재이 코드는 작동합니다.

여기 내 코드입니다.

public bool IsVisibleInApp 
{ 
    get 
    { 
    return this.Settings.IsApproved && this.Settings.IsAvailable && this.UserType == 2; 
    } 
} 

... 
... 

void SomeMethod(){ 
    var users = context.Users.Include(x => x.Settings) 
     .Where(x => x.IsVisibleInApp).ToList(); 

외래 키 this.SettingsID은 유효한 값입니다. 나는 에서 Where 절에 속성/메소드를 사용할 수 없으므로 SQL로 변환 될 것입니다. 하지만 확실하게 여기 주위에 방법이 있습니다 ... 아니면 .ToList()을 먼저 수행 한 다음 추가 .Where 호출을 사용해야합니다. 그러나 이것은 많은 추가 작업처럼 보이는 데이터베이스에서 모든 행을 가져 오는 것을 의미합니다. .

+0

나는 당신이 당신의 자신의 질문에 대답 생각합니다. 왜 데이터베이스가 C# 코드를 강조 표시합니까? LINQ가 C# 코드를 임의로 SQL로 변환하려고 시도하는 이유는 무엇입니까? 원래의 람다를 번역 할 수 있지만 속성의 getter는 변환 할 수 없습니다. 그게 효과가 있다면, 그 다음에 getter의 다른 데이터베이스에 서비스 호출이나 I/O를 포함시키면서 DB 서버에서 모든 것이 실행될 것으로 기대하십니까? – oerkelens

답변

1

당신은 당신이 (EF는 귀하의 재산 게터 내부에 가서 당신이 무엇을하는지 보이지 않는 것) 원하는대로 할 수는 없지만 정적 표현에 그 포장에 의해 코드의 반복을 줄일 수

public static Expression<Func<User, bool>> IsVisibleInAppExpression = x => 
    x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2; 

그리고 다음과 같이 사용하십시오 :

var users = context.Users.Include(x => x.Settings) 
    .Where(User.IsVisibleInAppExpression).ToList(); 

또는 확장 메서드를 만들어가 :

이 같은
public static class Extensions { 
    public static IQueryable<User> VisibleInAppOnly(this IQueryable<User> query) 
    { 
     return query.Where(x => 
      x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2); 
    } 
} 

그리고 사용 :

var users = context.Users.Include(x => x.Settings).VisibleInAppOnly();