我有一个包含用户和社区数据的简单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查询来执行此操作。我如何修改我的方法以支持它?
答案 0 :(得分:0)
使用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
和Skip
之前尚未枚举Take
,因此会导致单个SQL查询(查询将在ToList
上执行)。< / p>