【问题标题】:Is there a possibility to take 100 records then other 100 record from database table using LinQ and Take()是否有可能使用 LinQ 和 Take() 从数据库表中获取 100 条记录然后其他 100 条记录
【发布时间】:2016-12-12 10:36:32
【问题描述】:

使用代码优先,Oracle 数据库 如果有大量数据,我需要选择前 100 个记录, 但是我还需要有可能获得其余记录,那么如何从101开始获取接下来的100个记录?

是否有可能使用 Linq Take()?

List<int> myList = new List<int>();
List<int> newList = new List<int>();

myList = DBContext.MyTable.Where(x=>x.ID == someParam).Select(x=>x.ID).toList();
int recodCount = myList.Count();

if (recodCount > 1000)
{
    newList.AddRange(myList.Take(100));
}
else
{
    newList.AddRange(myList);
}

【问题讨论】:

  • 看看 Skip()
  • database.Skip(100).Take(100);
  • 使用ToList 作为最后的语句,否则你将全部选择到内存中
  • @TimSchmelter 你上面的评论是不正确的......它们还不会被具体化,sudo sql 将被生成但不会被执行......如果你想在调试器中看到你的值需要“ToList”,它们都将加载到内存中
  • @Seabizkit。 OP 两次致电ToList。好吧,在Where 之后第一次已经过滤了。但无论如何,他不需要两个列表。

标签: c# entity-framework linq code-first


【解决方案1】:

我想你需要分页你需要定义 pageIndex 和 pageSize

myList = DBContext.MyTable
                  .Where(x=>x.ID == someParam)
                  .Skip((pageIndex - 1) * pageSize)
                  .Take(pageSize);

但是,如果您只想跳过 100,那么您缺少的是 SkipEnumerable.Skip Method

就像蒂姆说的那样,不要在乞求时调用 ToList() 这将选择内存中的所有内容。也不要打电话给Count() 来检查if(count &gt; 100)。你应该这样做:if(myList.Skip(number).Any()) 如果你的集合的记录多于数量,这将是正确的。

【讨论】:

  • 无论如何我都需要这些记录...但仍在努力提高性能...当我有 newList 我需要另一个,我正在尝试使用 Include() 创建它.. 所以如果我有 100 条记录并首先显示它们(它运行速度很快)我希望这 100 条记录能够获得所需的信息)
  • @Sogaila 好的,不要像我写的那样在乞求检查中调用 ToList 并在 if 中使用 skip
  • 我正在使用 WPF...pageSize 和 pageIndex 呢
  • 但我明白了!谢谢
  • 别忘了 OrderBy。如果您不使用 OrderBy,则两个查询之间的排序可能不同,您可以在 page2 上看到 page1 项。
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多