我在下面有这个函数,它接受一个id列表并在DB中搜索匹配的人。
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 Duckett的答案中获取信息,只是展示解决方案:
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;
}
答案 0 :(得分:3)
请参阅此答案以拆分列表: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 :(得分:1)
我不确定为什么你有这样的方法。你究竟想做什么无论如何,你可以使用Skip和Take方法来进行分页。
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();
}