2017-05-17 13 views
2

, 나는 일반적으로 다음의 사용을 구성 1을 만들 수 있습니다 이것은 내가 인 항목을 테이블에서 찾을 때 MyEntity과 일치하는 것을 의미합니다.변수 값을 표현식 트리에서 클로저에 대한 멤버 액세스로 모델링해야하는 이유는 무엇입니까?</p> <pre><code>dbContext.Contents<MyEntity>() </code></pre> <p>(<code>dbContext</code> 사용자 정의 클래스이다.) 은 어떻게 든, Linq1Entities/엔티티 프레임 워크 이해 : 나는 람다 식으로 우리의 응용 프로그램에서 표현을 쓸 때

이제는 System.Linq.Expressions 클래스를 사용하여 표현식을 구성하고 있습니다. 그래서 같이 상기 단편을 복제하도록 시도 :

Expression.Call(Expression.Constant(dbContext), contentsMethod) 

contentsMethod 반사에 의해 이전에 적절한 MethodInfo로 초기화되었다.

불행히도, 이것은 작동하지 않습니다. Entity Framework는 dbContext 개체를 SQL로 변환 할 수 없다는 불만을 표시합니다.

저는 람다 식으로 원했던 것과 유사한 표현식을 작성했으며 디버거에서 결과 식 트리를 보았습니다. 흥미롭게도 상수 대신에 dbContext은 클로저 개체 인 것처럼 보이는 member access으로 모델링되었습니다.

왜 그렇습니까? 지역 변수 dbContext이 표현식의 클로저에 대한 멤버 액세스로 표현되는 이유는 무엇이며 왜 상수 값으로도 작동하지 않는 이유는 무엇입니까? 내 경우에는 dbContext이 둘러싼 메서드의 매개 변수였던 것이 중요합니까?

제 질문은 이 아니며 내 문제를 해결하는 방법입니다. 이미 수동으로 작성한 표현식에 본문을 추가하는 추가 람다 식으로 위에 표시된 조각을 도입하여 이미 수행했습니다.


1 : 사용되는 단편은 다음의 표현 방법의 예 :

dbContext.Contents<MyEntity1>().Where(e1 => dbContext.Contents<MyEntity2>().Any(e2 => e1.Name == e2.Key)) 
+0

dbContext는 다른 테이블로 구성된 데이터베이스 개체입니다. 선택 쿼리 테이블. 테이블은 다른 데이터 유형을 가진 컬럼으로 구성됩니다. 일반적으로 캐스팅은 열의 필드 유형에서 발생합니다. – jdweng

+0

'dbContext.Contents ()'을 사용하는 방법에 대한보다 완벽한 예를 보여줄 수 있습니까? 질문은 매우 불분명 한 듯하다. 나는 당신이 dbContext 매개 변수를 이해하고, 그것을 일부 λ에 전달하고, 그것을 가져오고 그것의 접근은 클로저 객체의 멤버 접근이된다. – Evk

+0

@Evk : 각주를 짧고 익명으로 표시했지만 표시된 단편을 포함하는 완전한 표현식을 추가했습니다. –

답변

1

dbContext가 폐쇄 개체에 접근으로 모델링되기 때문에이 위에 폐쇄 된 정의 람다 그 변수. 그것은 상수 값을 사용하지 않고 다른 값을 닫고 있으므로 Expression에 표시된 값입니다. 그것이 다른 것을한다면 그것은 람다를 적절하게 표현하지 못할 것입니다.

EF가 Expression을 SQL로 변환 할 수 없다고 말하면 코드 작성자가 주어진 표현식을 예상하지 않았으며 해당 패턴을 SQL에 매핑하지 않았다고 말하는 것입니다. 그들은 단순히이 일을하는 사람들을 예상하지 못했습니다 (또는 SQL에 매핑하는 방법을 알지 못했거나 그 기능을 추가 할 시간이 없었거나 없을 수도 있습니다).

+0

예,이 경우 결론은 무엇입니까? EF는 다른 어떤 멤버 일 때만'dbContext'를 처리 할 수 ​​있습니다. 상수 값으로 직접 제공되는 것이 아닌가요? –

+0

@ O.R.Mapper 당신이나 당신이 다른 방법으로지도 작성법을 모르는 다른 것을 했어. – Servy

+0

@ O.R.Mapper 정확한 결론입니다. 표현식 트리 변환을 사용하는 모든 트릭은 번역기가 인식/처리하는 표현 유형입니다. Servy가 그의 대답에서 언급했듯이, 당신의 케이스는 EF query translator에 의해 인식/처리되지 않는 것 같습니다. –