使用Linq to Entities在一次操作中获取COUNT和SKIP TAKE

我在Linq to Entities供电数据访问层中进行了数据调用,该层旨在进行分页调用。

在这样做时,我需要选择数据的一个子集,比如50行,但也要获得所有匹配的计数,以了解要分页的总匹配数。

目前,我正在做以下事情:

var queryResult = DatabaseContext.Table .Where(x => !x.IsDeleted) .Where(p => ( p.PropertyOne.ToLower().Contains(query) || p.PropertyTwo.ToLower().Contains(query) )); int count = queryResult.Count(); var returnData = queryResult .OrderBy(i => i.ID) .Skip(start).Take((length)) .Select(y => new ObjectDTO { PropertyOne = y.PropertyOne, PropertyTwo = y.PropertyTwo } .AsEnumerable(); 

这导致两个昂贵的数据库操作。 由于某种原因, COUNT操作实际上需要比SELECT操作更长的时间。

有没有办法在同一个操作中获取计数和子集?

我的逻辑流程说我们做了以下事情:

  • 看表
  • 在表中查找与条件匹配的项目
  • 获取所有比赛的计数
  • 返回匹配的编号子集

这似乎可以在一次操作中,但我无法弄清楚如何。

尝试一,慢

尝试了D Stanley建议将完整的结果集转换为List并在分页中进行计数和记忆,但它大约慢了2倍(平均6.9秒和平均3.9秒)

值得一提的是,数据集大约有25,000条记录,在JOIN中搜索了十几个相关表。

它可能是可能的,但由于您使用的标准,它可能不会快得多。 由于您在列值中搜索文本,因此无法使用索引,因此必须执行表扫描。 您可以执行单个查询来获取所有记录,并执行CountSkip/Take linq到对象:

 var queryResult = DatabaseContext.Table .Where(x => !x.IsDeleted) .OrderBy(i => i.ID) .Where(p => ( p.PropertyOne.ToLower().Contains(query) || p.PropertyTwo.ToLower().Contains(query) )) .ToList(); int count = queryResult.Count(); // now this will be a linq-to-objects query var returnData = queryResult .Skip(start).Take((length)) .AsEnumerable(); 

但你必须尝试它,看它是否会更快。