entity-framework - 如何在批量数据实体框架中使用 take 和 skip
问题描述
在我的数据库中有 100 万个会员数据。并且需要将这些数据加载到网格中。我有以下代码。
public List<MemberDto> GetMembers(string By = "", string searchTerm = "", string sortBy = "", string sortDiection = "")
{
List<EFModel.ClientData.Member> members = context.Members.ToList();
if (!string.IsNullOrEmpty(By))
{
if (By.ToLower() == "a")
{
members = members.Where(m => m.MemberNumber.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0).ToList();
}
else if (By.ToLower() == "n")
{
members = members.Where(m => m.LastName.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0).ToList();
}
}
List<MemberDto> memberDtos = new List<MemberDto>();
mapper.Map(members, memberDtos);
return memberDtos;
}
在我将上述数据绑定到网格数据源之前。我在做分页。通过为每个网格视图设置仅 25 条记录。但问题是获取数据需要相当长的时间,因此我需要在上述方法中执行分页部分和搜索部分。
所以,我尝试了这个查询。
int pageIndex = 1;
int page size = 25;
var members = (from m in context.Members
where (string.IsNullOrEmpty(searchTerm) || m.MemberNumber.Contains(searchTerm))
&& (string.IsNullOrEmpty(searchTerm) || m.LastName.Contains(searchTerm))
select m).ToList().Skip(pageIndex).Take(size);
但这需要相当长的时间来执行,我做错了什么。我该如何解决这个问题。我只想通过searchTerm
andpageSize
获取数据pageIndex
。在上面By
可以是a
或n
。a
对于 MemberNumber 和n
LastName
解决方案
这个:
string.IsNullOrEmpty(searchTerm) || m.MemberNumber.Contains(searchTerm)
需要全面扫描才能找到匹配的行。
和这个:
.ToList().Skip(pageIndex).Take(size);
将在分页之前加载所有匹配的行,并且没有保证的顺序,因此您可能会在页面之间获得重复或错过的行。
所以至少尝试一下(假设 MemberNumber 是唯一的):
.OrderBy(m => m.MemberNumber).Skip(pageIndex).Take(size).ToList();
推荐阅读
- python - 如何使用python将字符串转换为数组?
- python - 使用过滤 json 并获取 TypeError:字符串索引必须是整数
- node.js - 如何通过nodejs拨打SIP电话
- python - 一个带有'while'的线程python有另一个线程永远不会启动
- shell - 如何在谷歌驱动器中创建一个文件夹,在 shell 中使用 curl
- python-3.x - 从标签元素获取文本
- linux - 有没有办法“逃避”linux命令?
- javascript - 如何设置一个元素,使其使用父元素的剩余高度,而其上还有其他 2 个动态元素?
- c++ - 具有依赖类型的非静态数据成员的非限定名称是否依赖
- spring-boot - Spring Data JPA - findBy 映射对象