2014-05-20 4 views
1

나는이 문제에 곤란을 겪고 있습니다. 나는 내가 생각할 수있는 모든 것을 시도했고, 매 턴마다 방해 받았다.매개 변수 집합에 대한 쿼리

코드는 첫째, EF6, 데이터, 하위 목록 및 SubListProp 당신이이 샘플에서 볼 데이터 만 포함 :

string[] s = {"a", "b", "c"}; 
string[] s2 = {"1", "2", "3"}; 
var s3 = s.Zip(s2, (first, second) => new string[] {first, second}); 

var ctx = db.Data.Where(x => x.SubList.All(y => s3 
     .Any(z => y.SubListProp.Name == z[0] && y.Value == z[1]))); 

는 다음과 같은 가정한다.

분명히이 예는 SQL 식에 Array 인덱서가 허용되지 않으므로 작동하지 않습니다. SubList에 .AsEnumerable()을 추가하면 쿼리가 제대로 작동하지만 SQL Server가 아닌 클라이언트 측에서 테스트가 수행됩니다. 어떻게하면 데이터의 매개 변수화 된 집합으로 작동하는 Linq to Entities 쿼리를 생성 할 수 있습니까?

이 쿼리를 수정하여 SQL Server에서 완전히 실행되도록 할 수 있습니까? 그렇다면 어떻게?

+0

, 당신은 하나 개의 쿼리와 함께이 작업을 수행 할 수 있지만, 그렇게 될 것이다 엄청나게 비효율적 인 이유는 테이블에서 원하는 모든 행에 대해 비교해야하는 문자열 배열을 전달하기 때문입니다. s3의 항목 당 하나의 쿼리로 분리하십시오. –

+0

@ TravisJ - 300 쌍이 있다면 왕복 여행이 많습니다. AsEnumerable을 한 번만 사용하면 반환되는 항목 수가 많아 질 수 있기 때문에 신뢰할 수 없습니다. –

+0

채팅 하시겠습니까? http://chat.stackoverflow.com/rooms/7/c –

답변

1

아마 당신은 정면 문자열을 결합 할 수 있으며,이 같은 비교를 위해 사용하기 위해서는 다음 문자열을 프로젝트 : 솔직히

string[] s = {"a", "b", "c"}; 
string[] s2 = {"1", "2", "3"}; 
IEnumerable<string> s3 = s.Zip(s2, (first, second) => first+second);//a1,b2,c3 

var ctx = db.Data.Where(x => x.SubList 
    .All(y => s3.Contains(y.SubListProp.Name + y.Value))); 
+0

나는 그것을해야한다고 생각한다. 감사. –

+0

약간의 변경을해야했습니다 ... –