我有一个基于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
操作需要更长的时间。有没有办法在同一操作中获取计数和子集?在逻辑上,我们应该按照以下步骤进行:
- 查看表格
- 查找符合条件的表格项目
- 获取所有匹配项的数量
- 返回一个编号的匹配项子集
List
并进行计数和分页内存,但速度大约慢了2倍(6.9s平均值与3.9s平均值)。值得一提的是,数据集大约有25,000条记录,并且有十几个相关表格在JOIN中被搜索。
queryResult
枚举到List<T>
并在列表上使用.Count
,速度会更快吗? - mausworkscount
的值。我的意思是int count = queryResult.Count();
。 - Hui Zhao