c# - 使用 EntityFramework 的结果分页列表
问题描述
我有一个简单的 SQL Server 数据库,其中包含用户和社区的数据。任何用户都可以是任意数量的社区的成员,因此我有 3 个表:Users
、Communities
和Map
,以及相应的 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 查询来执行此操作。我如何需要修改我的方法来支持它?
解决方案
使用Skip
和Take
来实现分页。您还需要定义排序标准 ( 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 查询(查询将在 上执行)。Skip
Take
ToList
推荐阅读
- linux - 带有信号和进程的 Linux C 编程
- xml - 完美 XML 标记的 SAXParseException
- node.js - mocha 侧边栏未显示测试
- javascript - d3 js中的selectAll()也可以将css样式作为参数吗?
- lua - 从 TI-BASIC 调用 Lua
- python - Python - '.split' 功能无法正常工作
- actions-on-google - Google Actions 通过物理按钮触发
- php - centos服务器上php安装的问题
- vba - 从PPT中提取文本并使用VBA将其粘贴到Excel中
- python - SQLAlchemy:删除子对象不会更新父对象