2011-08-23 6 views
0

아래에이 ID의 목록을 가져와 일치하는 사람을 DB로 검색하는이 함수가 있습니다. 쿼리가 2100 개 이상의 쉼표로 구분 된 값 취할 수 없기 때문에여러 개의 쿼리로 쿼리를 분할 한 다음 결과를 결합하십시오.

public IQueryable<Person> GetPersons(List<int> list) 
{ 
    return db.Persons.Where(a => list.Contains(a.person_id)); 
} 

내가 네 쿼리에이를 분할해야하는 이유는 다음과 같습니다
The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.

을 어떻게 4 개 조각으로 목록을 분할 할 수 있고 각 목록에 대한 쿼리를 만듭니다. 그런 다음 결과를 하나의 인물 목록에 포함 시키십시오.

해결 내가 자신의 답변으로 게시하고 @George Duckett의 대답에서 멀리 cred하게되는 것을 원하지 않는 , 그냥 솔루션을 보여
:

public IQueryable<Person> GetPersons(List<int> list) 
    { 
     var persons = Enumerable.Empty<Person>().AsQueryable<Person>(); 
     var limit = 2000; 
     var result = list.Select((value, index) => new { Index = index, Value = value }) 
       .GroupBy(x => x.Index/limit) 
       .Select(g => g.Select(x => x.Value).ToList()) 
       .ToList(); 

     foreach (var r in result) 
     { 
      var row = r; 
      persons = persons.Union(db.Persons.Where(a => row.Contains(a.person_id))); 
     } 
     return persons; 
    } 

답변

2

분열이 답변을 참조하십시오 당신의 목록 : Divide a large IEnumerable into smaller IEnumerable of a fix amount of item

var result = list.Select((value, index) => new { Index = index, Value = value}) 
       .GroupBy(x => x.Index/5) 
       .Select(g => g.Select(x => x.Value).ToList()) 
       .ToList(); 

는 그런 그들을 결합하기 위해 아래의 사용 결과를 통해 foreach는 (리스트의 목록을) 할.

결과를 결합하는이 답변을 참조하십시오 :이 같은 방법을 왜 How to combine Linq query results

1

나는 확실하지 않다. 정확히 당신이하려는 것은 무엇입니까. 어쨌든 페이징에 사용되는 건너 뛰기 및 가져 오기 방법을 사용하여이 작업을 수행 할 수 있습니다.

List<Person> peopleToReturn = new List<Person>(); 

int pageSize = 100; 

var idPage = list.Skip(0).Take(pageSize).ToList(); 

int index = 1; 

while (idPage.Count > 0) 
{ 
    peopleToReturn.AddRange(db.Persons.Where(a => idPage.Contains(a.person_id)).ToList()); 
    idPage = list.Skip(index++ * pageSize).Take(pageSize).ToList(); 
} 
관련 문제