2

많은 Accounts이 있으며 각 계정에도 하위 계정이있을 수 있습니다. 따라서 계정이 루트인지 알 수있는 내 방법은 ParentId 속성의 값 덕분입니다.
그래서 내 코드가 많은 장소에서 같은 물건을 가지고 있다고 밝혀졌다 : .Where(acc => acc.ParentId == 0) 그래서는 다음과 같습니다 속성을 만드는 방법에 대해 생각 :술어에서 사용할이 속성을 단순화하십시오.

public bool IsRootAccount 
{ 
    return a.ParentId == 0; 
} 

작동하는 것 같다, 그것은 컴파일하지만 내가 할 실행할 때 다음과 같은 예외 :

Load operation failed for query 'GetAccounts'. The specified type member 'IsRootAccount' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

내가 원하는 것을 달성 할 수있는 간단한 방법이 있습니까?

또한 행운이없는 Expression<Func<Account, bool>>을 반환하는 무언가를 만드는 것에 대해 생각했습니다.

편집 :IsRootAccount 속성에 대한 나의 시도는 여기에 내가 발견 뭔가하지만 내가 더 나은 아무것도가 있는지 싶습니다이 .Where(acc => acc.IsRootAccount)

+2

'IsRootAccount'의 반환 유형이 반환 된 값과 일치하지 않습니다 ('bool'! = lambda). –

+0

고마워, 고쳤어 ... 다른 속성에서 복사 했어. – sebagomez

+0

이 속성을 사용하는 빌드하려고하는 쿼리를 표시 할 수 있습니까?여기서 원하는 것을 정확히 할 수 있을지는 의문이지만, 대안 솔루션을 제안 할 수 있습니다. –

답변

1

이 기능을 제공하는 아주 간단한 방법은 확장 방법을 사용하는 것입니다. 이 같은

시도 뭔가 : 당신은 다음 .WhereIsRootAccount()으로 .Where(acc => acc.ParentId == 0)의 모든 사용을 대체 할

public static class AccountEx 
{ 
    public static IQueryable<Account> WhereIsRootAccount(
      this IQueryable<Account> source) 
    { 
     return source.Where(acc => acc.ParentId == 0); 
    } 
} 

.

이 접근법의 장점은 EF와 함께 작동하고 루트 계정을 유창하게 쿼리 할 수 ​​있다는 것입니다. 루트 계정의 정의를 수정해야 할 경우 한 곳에서 변경할 수 있습니다. 그리고 불필요한 코드로 Account 클래스를 오염시키지 않습니다.

이 정보가 도움이되기를 바랍니다.


귀하의 의견을 바탕으로,이 시도 : Where 이후

public static class AccountEx 
{ 
    public static EntityQuery<Account> WhereIsRootAccount(
      this EntityQuery<Account> source) 
    { 
     return source.Where(acc => acc.ParentId == 0); 
    } 
} 

는 여전히 잘 작동합니다 EntityQuery<>에 의해 지원됩니다.

+0

나는 그 아이디어를 좋아합니다 ... 시도해 볼 것입니다 – sebagomez

+0

도움이됩니다, 감사합니다 ...하지만 그것은 사용할 수 없습니다. 실버 라이트 클라이언트, 맞죠? 클라이언트 쪽에서 그렇게하는 방법이 있습니까? – sebagomez

+0

@sebastian - Silverlight를 전혀 사용하지 않고 있습니다. Silverlight에서 작동하지 않을 것이라고 생각하는 이유를 말해 줄 수 있습니까? – Enigmativity

0

같은 것을 사용하기 위해서였다.
EF는 내 속성으로 인해 내 조건자를 SQL로 변환하는 방법을 알지 못한다고 생각합니다.

Context.Load(Context.GetAccountsQuery().Where(acc => acc.IsRootAccount), ParentAccountsArrived, null); 

을하지만 결과가 서버에서 다시 일단 내 속성을 필터링 할 수 있습니다 할 : 그래서 나는이 작업을 수행 할 수 없습니다

public void LoadParentAccounts() 
{ 
    Context.Load(Context.GetAccountsQuery(), ParentAccountsArrived, null); 
} 
void ParentAccountsArrived(LoadOperation<Account> lo) 
{ 
    foreach (var account in lo.Entities.Where(acc => acc.IsRootAccount)) 
    { 
     ParentAccounts.Add(account.Name); 
    } 
} 

이 갈 수있는 방법이 있나요? 이 변경으로 인한 성능 문제가 있습니까?

+0

무엇입니까 GetAccountsQuery 무엇입니까 – Nix

+0

는 IQueryable 을 반환하는 RIA 서비스의 한 방법입니다 – sebagomez

관련 문제