实体框架:跳过/接受功能

2024-02-24

我只是好奇 Skip 和 Take 函数如何在 Entity Framework 中工作(使用 EF 6.1)。

If I do:

db.Events.OrderByDescending(x => x.Date).Take(maxPageSize).ToList();

我得到了一些清单(注意到有一个事件完全消失了)。

If I do:

db.Events.OrderByDescending(x => x.Date).Skip(0).Take(maxPageSize).ToList();

我得到另一个列表,之前查询中消失的事件出现在此处。

任何人都知道为什么我必须这样做Skip() ZERO实体,以便Take()我应该拿什么?这几乎没有任何意义(至少对我来说)......

附:我无法使用 SQL Server Profiler 检查生成了哪些查询。


尽管细节可能有所不同,但所接受的答案在描述发出的查询有何不同方面基本上是正确的。我经常看到实体框架发出的查询为“TOP (@maxPageSize) .... WHERE [ROW_NUMBER] > @skip”,这可能是相同的差异,但我不能 100% 确定它是否生成相同的查询执行计划。

需要明确注意的重要区别是,当“ORDER BY”不包含唯一的列名时,这可能会产生不同的结果。

在我编写的代码中,当 @skip 值为 0 时,我们省略了“Skip”。我们有一个条目显示为最终条目。如果您随后转到应用了 @skip 值的下一页,则相同的条目将显示为该页面上的第一项。应该位于至少其中一个位置的“捆绑”项目从未出现。以下是每个发出的 SQL:

不跳过(在第 1 页生成):

SELECT TOP ({take number}) [Extent1].[Table1ID] AS [Table1ID], {snip a lot of other columns}
        FROM  [dbo].[Table1] AS [Extent1]
        LEFT OUTER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[Table2ID] = [Extent2].[Table2ID]
        WHERE ({my where clause conditions})
        ORDER BY [Extent2].[MySortColumn] ASC

Skip:

SELECT TOP ({take number}) [Filter1].[Table1ID], {snip a lot of other columns}
        FROM ( SELECT [Extent1].[Table1ID] AS [Table1ID], {snip a lot of other columns}, row_number() OVER (ORDER BY [Extent2].[MySortColumn] ASC) AS [row_number]
            FROM  [dbo].[Table1] AS [Extent1]
            LEFT OUTER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[Table2ID] = [Extent2].[Table2ID]
            WHERE ({my where clause conditions})
        )  AS [Filter1]
        WHERE [Filter1].[row_number] > {skip number}
        ORDER BY [Filter1].[MySortColumn] ASC

重要的一点是回到“SQL 101”并记住这一点如果没有“order by”,则无法保证订单 https://sqlblogcasts.com/blogs/sqlandthelike/archive/2010/06/27/sql-101-without-order-by-order-is-not-guaranteed.aspx。这种发出的差异会导致一个项目在网格的多个页面上重复,而另一个项目根本不会显示,这让我发现这在实体框架中更为重要,其中生成的确切 SQL 并不直接由您控制,并且未来的 EF 版本可能会出现意外的变化.

目前,您可以通过始终包含 Skip(0) 来避免这种情况,它将发出第二个查询,但 {skip number} 只是为零。在我的测试中,这似乎总是使用 T-SQL 的默认规则为决胜局发出相同的顺序。我认为假设这一定会在实体框架的未来版本中起作用并不是最佳实践。相反,我建议您考虑探索打破平局的策略 http://www.itprotoday.com/software-development/t-sql-tiebreakers你自己。就我而言,应该可以打破“Table1ID”的束缚,因为它代表唯一的身份主键列。不过,所附文章针对更复杂的情况提供了建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架:跳过/接受功能 的相关文章

随机推荐

  • 带有自定义标头的 Resttemplate GET 请求

    我需要发送带有标头的 GET 请求 Content Type application camiant msr v2 0 xml 我期望来自服务器的 XML 响应 我用 Postman 测试了请求和响应 一切都很好 但是当我尝试在春天这样做时
  • 密码哈希 PHP 7 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我目前正在学习 PHP 并且一直在论坛中查找有关如何最好地在 PHP 中对密码进行哈希处理的最新想法 任何人都可以建议目前最好使用的密码哈希方法
  • JSON 嵌套在 POJO 中

    我有一个 POJO 类 public class D private JSONObject profileData public JSONObject getProfileData return profileData public voi
  • 如何在 Eclipse Juno 中打开 OSGi 控制台?

    eclipse console 上面的命令在不同的窗口中打开 OSGi 控制台和 Eclipse IDE 是否有任何选项可以将 OSGi 控制台引入 Eclipse 的控制台视图中 您只需选择 主机 OSGi 控制台 http archiv
  • 使用 JUnit 进行单元测试时如何处理异常?

    如果一个方法抛出异常 如何编写测试用例来验证该方法实际上抛出了预期的异常 在最新版本的 JUnit 中 它是这样工作的 import org junit Rule import org junit Test import org junit
  • 迭代多维关联数组 PHP 中的每个键和值

    我刚刚了解了键 值对 我尝试寻找现有的答案 并尝试了解有关键 值对和关联数组的知识 尽管这有点太耗时了 我很难弄清楚如何迭代这个多维关联数组而不出现任何错误 arr array test1 gt array testing 1 1 gt a
  • 使用索引和列作为 X、Y 以及值作为 Z 将 pandas DataFrame 转换为 3D 图表?

    我正在尝试使用 Pandas Dataframe 创建 3d 波动性表面 我觉得我拥有所有信息 但我不确定如何从中创建 3d 图表 我读过的每本指南似乎都使用 3 个独立的数组 但我觉得我拥有的数据应该是可图形化的 我当前的数据框如下所示
  • graphql中resolver函数的不同实现说明

    我一直在阅读 graphQL 文档 发现他们以两种方式解释了 graphql 服务器的实现 一种使用 graphql yoga 这是一个功能齐全的 graphql 服务器 另一种是使用 graphql express graphql 和ex
  • 将 War 文件部署到 Azure [重复]

    这个问题在这里已经有答案了 我正在尝试将 Web 服务的 War 文件上传到运行 tomcat 8 的 Azure 我在 onedrive 上的相关 webapps 文件夹中有 war 文件 但是部署始终失败 令人沮丧的是它没有错误消息 我
  • @导入“基础”;基础错误5

    我在我的项目中使用foundation5 并完成了其网站和中定义的所有设置http thesassway com http thesassway com1 http thesassway com但是当我使用 import foundatio
  • Nodejs:迭代 req.files 属性

    我对 Nodejs 很陌生 有时会遇到困难 例如 我正在通过 AJAX 发送图像文件并在我的应用程序中成功接收它 console log req files 打印 img 1351078491675 size 354683 path tmp
  • Amazon AWS S3 目录结构效率

    我脑子里闪过一个简单的效率问题 我创建了一个 PHP 代码 用于将文件夹中的所有文件上传到 Amazon S3 上的存储桶 我的代码也能够以子文件的形式上传文件 而不会丢失其结构 基本上 用户必须登录我的网站 然后根据用户的帐户名 他们可以
  • 从 php 运行蹩脚

    我正在尝试从 php 脚本运行蹩脚 我已经尝试过这些 但没有运气 我没有得到任何回报 有任何想法吗 system lame returnarr system lame help returnarr exec lame returnarr p
  • 如何使用索引访问ListView中的委托属性

    我想访问委托属性ListView 我尝试过contentItem但有时是undefined 这是我的代码 ListModel id modeldata ListElement name don rank 1 ListElement name
  • 如何从领域数据库中查询具有不同结果的java

    我有一个Realm对象类 并在其中存储大量数据 想象我有一个String uid 场地 我想获取 uid 名称 但相同的 uid 名称只能获取一次 例如 uid AA AA BB CC DD BB BB 我想得到只是 AA BB CC DD
  • 具有两个或多个参数的 ITransformableFilterValues 接口 [SharePoint WebParts]

    我使用 Sharepoint 并尝试使用多个参数连接 Web 部件 我的问题是如何将多个参数从自定义 Web 部件传递到另一个参数 我可以通过在自定义 webpart 中实现 ITransformableFilterValues 接口来传递
  • eclipse 在无限循环中开始“构建工作区”

    是否可以在 Eclipse 中调试哪个进程触发了 构建工作区 我有一个带有一些 BIRT 报告的 Java 项目 当该项目打开时 Eclipse 将无限循环地重新启动 构建工作区 我正在使用 Eclipse 3 6 1 和 BIRT 2 6
  • 理解“随机性”

    我无法理解这个问题 哪个更随机 rand OR rand rand 我发现这是一个真正的脑筋急转弯 你能帮我吗 EDIT 直觉上我知道数学答案是它们同样随机 但我忍不住认为 如果你在将两者相乘时 运行随机数算法 两次 你会创建比仅仅做更随机
  • 为什么 String.match( / \d*/ ) 返回空字符串?

    有人可以帮助我理解为什么使用 d 返回包含空字符串的数组 而使用 d 返回 100 如预期 我明白为什么 d 有效 但不明白为什么 d 不起作用 使用 是否会导致它返回零长度匹配 这到底是如何工作的 var str one to 100 v
  • 实体框架:跳过/接受功能

    我只是好奇 Skip 和 Take 函数如何在 Entity Framework 中工作 使用 EF 6 1 If I do db Events OrderByDescending x gt x Date Take maxPageSize