2011-08-23 138 views
0

我有下面这个函数需要一个id的列表,并搜索数据库的匹配的人。拆分查询到多个查询,然后加入结果

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

我之所以需要这个分成四个查询是因为查询不能取超过2100逗号分隔值:
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达克特的答案拿名气而去,只显示解决方案:

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; 
    } 

回答

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(); 
}