c# - 在 EF 上查询虚拟列表属性
问题描述
我正在尝试在当前返回由 N:M 关系产生的虚拟列表的查询中获取分页结果:
var selectedProfiles = await (from a in _context.USER_PROFILES
where a.Id == id
select a.Followers).FirstOrDefaultAsync();
问题是:我尝试了不同的方法,但没有一个有效,我要存档的是:
var selectedProfiles = await (from a in _context.USER_PROFILES
where a.Id == id
select a.Followers.Skip((pageNum - 1) * pageSize).Take(pageSize))
.FirstOrDefaultAsync();
显然上面的代码不起作用,但我的目标应该很清楚。有没有办法在不查询 N:M 表的情况下存档这个结果?该数据库是 mariaDB 的最新版本
解决方案
听起来您想要给定个人资料的一组分页关注者?
var followers = _context.USER_PROFILES
.Where(x => x.Id == id)
.SelectMany(x => x.Followers)
.OrderBy(x => /* Order your followers.. */)
.Skip((pageNum-1)*pageSize)
.Take(pageSize)
.ToList();
使用分页时,始终提供OrderBy
/OrderByDescending
条件很重要。
但是,如果您希望用户配置文件仅包含关注者的第一页,则需要使用投影来填充视图所需的内容,而不是尝试传递实体。为用户配置文件返回的实体图应该始终是完整的。不能“过滤”相关实体,否则 EF 如何区分以这种方式加载的部分实体与完整实体?
要获取关注者的用户个人资料 /wa 页面:
var profile = _context.USER_PROFILES
.Where(x => x.Id == id)
.Select(x => new UserProfileViewModel
{
Id = x.Id,
Name = x.Name,
// Add the fields to be displayed.
Followers = x.Followers
.Select(f => new FollowerViewModel
{
Id = f.Id,
Name = f.Name,
// Add the fields to be displayed.
}).OrderBy(f => /* Order your followers.. */)
.Skip((pageNum-1)*pageSize)
.Take(pageSize)
.ToList()
}).Single();
使用视图模型意味着您的视图将与之交互的部分模型与实体正在跟踪的完整数据状态之间没有混淆。它还允许 EF 生成更有效的查询,而不是选择/序列化整个实体图。
推荐阅读
- angular - 如何在打字稿中获得给定时间和当前时间的差异是
- python - TensorFlow 1D 模型,MaxPooling 的输入形状错误
- laravel - 从控制器运行时如何获得作业结果?
- python - CVXPY 奇异二次方的平方根
- django - Django 表单访问其他数据
- ios - iOS - 由于内存问题错误而终止
- express - Express Validator 使用 5.3.0 中间件功能
- python - 我的笔记检测算法在少数情况下失败?
- delphi - MakeScreenshot 用于动态创建的控件
- python-3.x - tornado_json 单元测试异步方法