2011-10-03 4 views
6

에 사용되는 사전은 내가 가진 :LINQ : 쿼리

List<int> l = new ... 
var a = SomeEntity.Where(f => l.Contains(f.someValue)) 

그래서이 제한 사항입니다 : 목록으로 작동하는 동안

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue)) 

이 오류를

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method 

을 생산 EF에 linq 또는 뭔가 빠졌나요?

답변

10

엔터티 프레임 워크의 특성 - 쿼리를 식에 넣으면 서버에서 작업을 수행 할 수 있도록 식을 SQL로 변환하는 것이 가장 좋습니다.

첫 번째 예에서는 쿼리 및 사전 검색 호출을 모두 SQL로 변환하려고 시도하지만 알 수 없기 때문에 불가능합니다.

두 번째 예에서는 목록을 쿼리에 전달하는 것입니다. 그것을 SQL로 변환하는 방법을 알고 있습니다.

EF 쿼리를 정의하기 전에 몇 가지 문제가 있으므로주의해야합니다.

편집 그냥 사전에서 읽을 때 첫 번째 쿼리가 쿼리 결과를 사용합니다 것으로 나타났습니다.

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity 
    .ToArray() 
    .Where(f => dict[f.key].Contains(f.someValue)); 
: 실제로 SQL 쿼리로 사전을 통과 할 수 있기 때문에 그래서, 당신은 아마 처음 DB에서 모든 레코드를 검색해야합니다, 다음과 같이, 당신의 검사를 수행하기 위해 LINQ - 투 - 객체 사용

ToArray() 메서드는 전체 결과 집합을 메모리로 가져옵니다 (다른 방법이 있지만 일반적으로 이렇게하는 방법입니다). 다음 Where 절은 LINQ- 개체 대신 LINQ- 개체로 실행됩니다. 귀하의 사전 코드가 잘 실행된다는 것을 의미합니다.

+0

매우 명확한 답변, 감사합니다. – ren