【问题标题】:Skip and Take in Entity Framework Core跳过并学习 Entity Framework Core
【发布时间】:2020-03-13 03:31:40
【问题描述】:

我有简单的 POCO 课程:

public class Library
{
    [Key]
    public string LibraryId { get; set; }

    public string Name { get; set; }

    public List<Book> Books { get; set; }
}

public class Book
{
    [Key]
    public string BookId { get; set; }

    public string Name { get; set; }

    public string Text { get; set; }
}

我有一个查询,它返回已包含书籍的图书馆:

dbContext.Set<Library>.Include(x => x.Books);

我正在尝试跳过 5 个库,然后选择其中的 10 个:

await dbContext.Set<Library>.Include(x => x.Books).Skip(5).Take(10).ToListAsync();

问题是,当我尝试对此查询执行 SkipTake 方法时,它返回的图书馆没有包含书籍列表。

如何使用SkipTake 保存以前包含的实体?

【问题讨论】:

  • SkipTake 使用的语法是什么?既然这是问题所在,您可能应该在问题中包含这些内容。
  • @MattRowland 编辑了问题,问题出在这些方法中。
  • 你有没有在你的连接中使用它(options => options.UseSqlServer(connection).UseRowNumberForPaging());
  • 它有效,但它不弃用仅用于向后兼容的方法吗?
  • @BassamAlugili 如果我使用UseRowNumberForPaging())Skip 不适用于此。

标签: c# entity-framework entity-framework-core


【解决方案1】:

通常在使用SkipTake 方法之前,您需要先订购。尝试像这样按名称排序:

await dbContext.Set<Library>().Include(x => x.Books)
                              .OrderBy(x=>x.Name)
                              .Skip(5)
                              .Take(10)
                              .ToListAsync();

据我所知,您的查询应使用 OFFSET-FETCH 过滤器进行翻译,该过滤器需要存在 ORDER BY 子句。

【讨论】:

  • 我读到有一些奇怪的行为,当你使用包含然后尝试分页稍后:github.com/aspnet/EntityFramework/issues/4637。只是想知道,您使用的是什么版本的 EF7 和 SQL?
  • 我正在使用"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
  • 尝试将您的 EF 库更新为 rc2,也许该版本已修复此问题。我在 github 上看到的另一条评论是尝试在分页后调用Include
  • Include 分页后不起作用。请参阅您的问题链接,该问题尚未解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多