首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询EF上的虚拟列表属性

查询EF上的虚拟列表属性
EN

Stack Overflow用户
提问于 2020-03-02 19:43:55
回答 1查看 234关注 0票数 3

我试图在当前返回由N:M关系产生的虚拟列表的查询上获得分页结果:

代码语言:javascript
复制
var selectedProfiles = await (from a in _context.USER_PROFILES
    where a.Id == id
    select a.Followers).FirstOrDefaultAsync();

问题是:我尝试过不同的方法,但是没有一种方法有效,我想要存档的是:

代码语言:javascript
复制
        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的最新版本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-02 23:13:04

听起来你想要一组给定的个人资料的分页追随者?

代码语言:javascript
复制
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,需要一页追随者:

代码语言:javascript
复制
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生成更高效的查询,而不是选择/序列化整个实体图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60495592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档