将查询拆分为多个查询,然后加入结果

时间:2011-08-23 09:27:06

标签: c# asp.net asp.net-mvc

我在下面有这个函数,它接受一个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;
    }

2 个答案:

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