【问题标题】:Split query into multiple queries and then join the results将查询拆分为多个查询,然后将结果连接起来
【发布时间】:2011-08-23 19:14:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    请参阅此答案以拆分您的列表: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

    【讨论】:

      【解决方案2】:

      我不知道你为什么有这样的方法。你到底想做什么。无论如何,您可以使用用于分页的 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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-04
        • 2015-07-16
        • 1970-01-01
        • 2011-12-24
        • 2022-12-18
        • 2016-05-23
        • 2015-04-27
        • 1970-01-01
        相关资源
        最近更新 更多