C# 查询EF上的虚拟列表属性
我正在尝试对当前返回由N:m关系生成的虚拟列表的查询获取分页结果:C# 查询EF上的虚拟列表属性,c#,entity-framework,linq,entity-framework-core,C#,Entity Framework,Linq,Entity Framework Core,我正在尝试对当前返回由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
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表的情况下存档此结果?
DB是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如何区分以这种方式加载的部分实体和完整实体
要获取用户配置文件/w一页关注者,请执行以下操作:
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生成更高效的查询,而不是选择/序列化整个实体图。您是否尝试过
.Include(e=>e.Followers)
?是的,包含属性也不是问题,使用include将加载整个列表请提供一个您无法筛选导航属性或include
-我认为您需要使用显式的join
。谢谢!我甚至没有想过这样做,这是非常有意义的!