【问题标题】:How to use take and skip for bulk data entity framework如何在批量数据实体框架中使用 take 和 skip
【发布时间】:2021-08-19 08:29:27
【问题描述】:

在我的数据库中有 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);

但这需要相当长的时间来执行,我做错了什么。我该如何解决这个问题。我只想通过searchTermpageSizepageIndex 获取数据。以上By可以是ana 用于 MemberNumber 和 n 用于 LastName

【问题讨论】:

  • 怎么不工作了?
  • @GertArnold 抱歉这个查询需要相当长的时间来执行
  • @GertArnold 你能帮我解决这个问题吗
  • 数据库品牌是什么,EF版本是什么?生成的 SQL 是什么样的?
  • @GertArnold EF 6.2.0,SQL 服务器。如何查看生成的 SQL

标签: entity-framework skip take


【解决方案1】:

这个:

string.IsNullOrEmpty(searchTerm) || m.MemberNumber.Contains(searchTerm)

需要完整扫描才能找到匹配的行。

还有这个:

.ToList().Skip(pageIndex).Take(size);

将在分页之前加载所有匹配的行,并且没有保证的顺序,因此您可能会在页面之间获得重复或错过的行。

所以至少尝试一下(假设 MemberNumber 是唯一的):

.OrderBy(m => m.MemberNumber).Skip(pageIndex).Take(size).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 2012-06-12
    • 2014-10-04
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2016-10-03
    相关资源
    最近更新 更多