首页 > 解决方案 > 使用 EntityFramework 的结果分页列表

问题描述

我有一个简单的 SQL Server 数据库,其中包含用户和社区的数据。任何用户都可以是任意数量的社区的成员,因此我有 3 个表:UsersCommunitiesMap,以及相应的 POCO C# 类。我使用 EntityFramework 来获取所有社区及其成员的字典:

public Dictionary<Community, List<User>> GetData()
{
    var communitiesAndUsers =
        from community in DbContext.Communities
        from map in DbContext.CommunityUserMap.Where(c => c.Community == community )
        select new { Community = community, User = map.User };


    var result = new Dictionary<Community, List<User>>();
    foreach (var communityGroup in communitiesAndUsers.ToList().GroupBy(x => x.Community.Id))
    {
        var community = communityGroup.First().Community;
        var users = communityGroup.Select(g => g.User).ToList();
        result.Add(community, users);
    }

    return result;
}

现在我需要在这个方法中支持分页:

public Dictionary<Community, List<User>> GetData(int page, int communitiesPerPage)

而且我需要使用 1 个 SQL 查询来执行此操作。我如何需要修改我的方法来支持它?

标签: c#entity-framework

解决方案


使用SkipTake来实现分页。您还需要定义排序标准 ( Orderby) 以获得一致的结果。

var pagedCommunityGroups = communitiesAndUsers
    .GroupBy(cau => cau.Community.Id)
    .OrderBy(grp => grp.Key)
    .Skip(page * communitiesPerPage) // assume first page has number 0
    .Take(communitiesPerPage)
    .ToList();                       // execute query

因为在你申请和communitiesAndUsers之前没有枚举,这将导致单个 SQL 查询(查询将在 上执行)。SkipTakeToList


推荐阅读