c# - 查询EF上的虚拟列表属性

标签 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.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 条件非常重要。

但是,如果您希望用户个人资料仅包含关注者的第一页,则需要使用投影来填充您的 View 所需的内容,而不是尝试传递实体。为用户配置文件返回的实体图应始终完整。相关实体无法“过滤”,否则 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();

使用 View 模型意味着 View 将与之交互的部分模型和实体正在跟踪的完整数据状态之间不会产生混淆。它还允许 EF 生成更高效的查询,而不是选择/序列化整个实体图。

关于c# - 查询EF上的虚拟列表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495592/

相关文章:

c# - nhibernate 使用先前的状态创建

c# - 从内存中释放 CSharpCodeProvider 生成的代码

c# - EF Core 嵌套的 Linq 选择结果在 N + 1 个 SQL 查询中

c# - 如何使用 LINQ 创建条件 where 子句

c# - Entity Framework 6.1 Code First MySql 实体跟踪在上下文中持续存在

c# - LINQ 中的循环移动平均滤波器

c# - 尝试删除 Azure Functions 中的 blob,但缺少 DeleteIfExists 方法

entity-framework - 具有实体替换的 Doctrine 2 模块化应用程序

c# - 如何尽可能简单地使用 Linq 从字典中选择多个值

c# - Linq to SQL DataContext 无法更新数据库中继承对象的枚举字段