Wes*_*ley 5 c# linq sql-server entity-framework entity-framework-6
我在 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();
Run Code Online (Sandbox Code Playgroud)
这会导致两个代价高昂的数据库操作。由于COUNT
某种原因,操作实际上比SELECT
操作花费的时间更长。
有没有办法在同一个操作中获得计数和子集?
我的逻辑流程说我们执行以下操作:
这在一次操作中似乎是可能的,但我不知道如何进行。
尝试一,更慢
尝试了 D Stanley 将完整结果集转换为 aList
并在分页中进行计数和内存的建议,但它大约慢了 2 倍(平均 6.9 秒与平均 3.9 秒)
值得一提的是,数据集大约有 25,000 条记录,在 JOIN 中搜索了十多个相关表。
这可能是可能的,但由于您使用的标准,它可能不会快得多。由于您要在列值中搜索文本,因此无法使用索引,因此必须执行表扫描。您可以执行单个查询来获取所有记录并在 linq-to-objects 中执行Count
and操作:Skip/Take
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();
Run Code Online (Sandbox Code Playgroud)
但你必须尝试一下,看看是否会更快。
归档时间: |
|
查看次数: |
3796 次 |
最近记录: |