2010-11-26 4 views
0

"일괄 처리"테이블과 "테스트"테이블에 "일괄 처리"FK가 포함되어 있고 많은 테스트가 일괄 처리에 속할 수있는 시나리오가 있습니다.많은 LINQ 스택 오버플로 선택

여러 배치를 선택하고 해당 배치에 속한 모든 테스트를 찾을 수 있기를 원합니다.

var ret = 
from t in tests 
from b in indices //indices is a list of long PK's belonging to selected batches 
where t.batch_id == b 
select t; 

그것은 작동하지만 내 선택의 크기가 14 개 배치를 초과 할 때, 나는 "SQLite는 오류 파서를 얻을 : 나는 그 다음 내가 관심이있는 배치와에 다음 LINQ 쿼리를 PK와의 목록을 생성하여이 작업을 수행 할 스택 오버플로 "얼마나 많은 테스트를 찾을 수 관계없이 LINQ 식.

가능하면 큰 선택을 처리 할 수 ​​있기를 원합니다. 어떻게해야합니까?

+2

누군가 LinqToSql이라고 태그를 지정했습니다. 확인 할수 있어요? 그렇지 않은 경우 태그를 수정하십시오. 또한 - Sqlite 오류가 발생하기 때문에 데이터베이스로 보낸 sql을 게시 하시겠습니까? (사용 DataContext.Log = Console.Out, linq to sql을 사용하는 경우 –

+0

LINQ to SQL은 SQLite와 작동하지 않습니다 – DamienG

+0

SQLite ADO.net 공급자를 사용하는 LINQ to LINQ를 사용하는 것이 가장 가능성이 있습니다 linq-to- sql 태그가 제거되고 sqlite와 ado.net이 추가되었습니다. –

답변

0

LINQ 공급자가 인덱스 당 하나의 쿼리를 실행하려고하기 때문에 폭주 할 수 있습니다. DB를 프로파일 링하고 실제로 인덱스 당 1 개의 쿼리를 발행하는지 확인하여이를 확인할 수 있습니다 (SQL이 실제로 생성되는 경우). 당신이 당신의 자신의 SQLite는 컴파일해야 할 수도 있습니다,

var ret = 
from t in tests 
where indices.Contains(t.batch_id) 
select t; 
1

하는 JeffN825의 쿼리 내가 너무 일을 높은 확률을 줄 것이다 문제를 해결하지 않는 경우와 -DYYSTACKDEPTH 값을 설정 :

대신 시도 과태 무언가보다는 더 큰 무언가에. 그래서 당신은 그것이 무엇에 설정되어 있는지 알아야 할 것입니다 그리고 아마 그것을 두 번 거기에서 이동하십시오. 당신이 통과하게 될 전체 라인은 CFLAGS="-DYYSTACKDEPTH=1000"이 스택을 얼마나 깊게 할 것인지를 1000으로 바꾸는 것입니다.