有没有办法运行查询并检查聚合数据而无需再次重新运行查询?

2024-05-01

在决定枚举 LINQ 查询的结果集之前,我想查看查询结果计数(可能还有其他聚合数据)。

几乎每个 LINQ 示例都会立即枚举 foreach 循环中的结果。但我想检查计数以确定是否需要循环每个结果。有没有办法运行查询并检查聚合数据而无需再次重新运行查询?如果我做类似的事情

query.Count()
foreach(var item in query) { ... }

我想它会执行两次查询,但不需要再次重新执行...仅枚举 Count() 已返回的结果集。

查询 SQL 数据库时,首先运行单独的聚合查询,然后运行另一个查询来获取行数据(如果需要)通常非常有效。但是,如果我正确理解 LINQ,它将在本地执行相同的操作(相同的循环和逻辑,无需任何特定的优化),无论我获取 Count() 还是执行 foreach。是否有一种有效和/或内置的方法来保存多个操作的结果?


在.NET中,IEnumerable<T>序列是惰性的:这意味着当且仅当您需要时才执行底层逻辑。副作用是,如果您两次需要结果,则逻辑会执行两次。

例如,如果序列绑定到 SQL 数据库的结果,那么如果您首先计算元素数量,然后列出所有元素,则 SQL 查询将执行两次。

某些 LINQ 方法只是转换您的结果will得到,但没有实际得到结果。例如,var b = a.Where(a > 0);不会运行底层逻辑,而是推迟到您真正需要结果为止。

其他 LINQ 方法有效地强制执行逻辑。Count()例如,将强制加载所有元素以便对它们进行计数。ToArray() or ToList()也会这样做,将元素存储在内存中以供进一步使用。

您正在寻找的方法完全取决于上下文。

一般来说,您可能希望将序列存储在内存中,例如使用ToList()——以便稍后对其进行多种操作,例如计算元素的数量,然后循环遍历所有元素。另一方面,在某些情况下您还需要其他东西:

  • 为了将所有内容加载到内存中,底层逻辑的影响可能太大,迫使您寻找更智能的解决方案。想象一下,您正在进行数据库搜索,并且想要显示结果数量(例如 2 000 000)以及前 20 个条目。您真的需要将所有 2 000 000 个结果存储在内存中吗?可能不会。

    这里的解决方案是做一个countSQL 查询(数据库引擎将能够优化),然后是获取前 20 个结果的实际查询。

    类似的例子是当您获取很少的元素时,但需要许多 CPU 周期才能获取单个元素。有时,当您只需要对元素进行计数时,可以使用快捷方式来简化复杂的工作。

  • 或者可能会发生相反的情况:底层逻辑和数据量太小而无法真正关心。想象一下你正在与里面的人物打交道A-Za-z范围。真的有必要做一个ToList()?计数,然后分别循环遍历字符不是更容易吗?

  • 有时,甚至不可能将所有元素存储在内存中。例如,如果您有无限序列(例如从不断写入的日志文件中刷新的行)怎么办?

但是,如果我正确理解 LINQ,它将在本地执行相同的操作(相同的循环和逻辑,无需任何特定的优化),无论我获取 Count() 还是执行 foreach。

这完全取决于您使用的 ORM。当您创建 LINQ 查询时,例如:

var count = this.SequenceFromDatabase
    .Where(product => product.Price > 0)
    .Count();

foreach (var product in this.SequenceFromDatabase.Take(10))
{
    ...
}

一些(如果不是大多数)ORM 实际上会将其转换为:

select count(1) from [Schema].[Table] where [Price] > 0

select top 10 [Name], [Price], [Availability] from [Schema].[Table]

鉴于从 LINQ 到 SQL 查询的实际转换取决于 ORM 和您编写的实际 LINQ 代码,因此必须密切关注正在执行的 SQL 查询。许多 ORM 都能够跟踪 SQL 查询,并且某些 SQL 引擎还允许您分析查询。

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

有没有办法运行查询并检查聚合数据而无需再次重新运行查询? 的相关文章

随机推荐

  • 如何以 Express 方式传输响应?

    我一直在尝试让一个快速应用程序以流形式发送响应 var Readable require stream Readable var rs Readable app get report function req res res statusC
  • VideoView SeekTo 在不同设备上工作异常 - Android

    我在视频视图上使用此代码来寻求自定义位置 但它在三星设备上工作正常 但在索尼设备上 视频寻求开始位置 开始 我想让视频回到上次暂停的位置 创建视频视图 VideoView mVideoPlayer setVideoPath ViDpath
  • RS 232 中断信号

    我有一个RS232信号捕获设备 而且效果很好 我需要一些帮助来理解数据 基本上我们购买它是因为我们正在处理 80 年代末使用串行通信的机器控制器 尽管知道端口参数 但我们运气不佳 从我转储的数据来看 机器控制正在使用中断信号作为其协议的一部
  • 如何禁用 django-rest-framework 的管理风格可浏览界面?

    我在用django rest framework http django rest framework org 它提供了一个很棒的 Django 管理风格的可浏览的自文档 API 但任何人都可以访问这些页面并使用该界面添加数据 POST 我
  • 如何使用 Material-ui@next TextField 错误道具

    我想使用 Material UI Next 文本字段error props link https material ui next com api text field textfield 道具类型为boolean 之前版本的 Materi
  • 将日期添加到日历热图 R

    I m plotting a calender heat map using Paul Bleicher s calenderHeat R code https raw githubusercontent com iascchen VisH
  • 我可以使用 DataContract 序列化程序序列化 Dictionary 吗?

    我计划构建一个 WCF 服务 返回序列化为 JSON 的通用字典对象 不幸的是 序列化失败 因为对象可能总是不同的 KnownTypes 没有帮助 因为属性类型是 Dictionary 而且我不能说 KnownType 因为类可能总是不同
  • 在 .NET 中可以将数组或列表作为属性返回吗?

    我正在阅读 MSDN 上的一些文档 了解有关某些内容是否应该作为属性或方法实现的注意事项 我特别遇到了一条规则 对此我有疑问 如果 操作返回一个数组 请使用方法 而不是属性 页面在这里 在属性和方法之间进行选择 https msdn mic
  • 使用 serde 通过数值作为类型标识符对 json 进行反序列化

    我对 Rust 很陌生 并且有 OOP 背景 所以 也许我误解了一些 Rust 基础知识 我想用 serde 解析固定的 json 结构 该结构代表不同的消息类型之一 每条消息都有一个数字type属性来区分它 各个消息类型的确切结构大多不同
  • 仅隐藏输入字段的内容

    我有一个与输入字段重叠的跨度 当您在输入字段中键入内容时 它会更新其内容 尽管我将跨度完美地定位在输入文本上 但您仍然可以看到文本更加粗体并且字母更粗 field nr 1 with span nr 2 without 我尝试隐藏整个输入字
  • 如何在 git log 中查看提交的 git bisect 状态?

    我正在做 git bisect 到目前为止我发现了一些好的和坏的提交 我可以通过运行来确认git bisect log 但是 如果我为我的分支运行 git loggit log graph decorate full origin mast
  • Windows API 代码包 - ShellFile 不生成 PDF 位图

    使用之前堆栈溢出问题中的代码 System Drawing Bitmap image ShellFile f ShellFile FromFilePath fileLocation image f Thumbnail ExtraLargeB
  • 如何在 Postgres 中对包含语义版本的列进行排序

    有没有办法高效存储https semver org https semver orgPostgres 中的版本字符串 然后执行最新查询 例如假设列的值为 1 1 0 1 0 0 1 2 0 1 0 1 rc 1 B001 我想排序并获取最新
  • Socket IO聊天例子很慢

    我是 Node js 和 Socket IO 的新手 我想尝试一下解释的示例 https socket io get started chat https socket io get started chat 我做了我必须做的一切 它起作用
  • 不同 Perl 安装造成的混乱

    我尝试升级 Perl 却把我的电脑搞得一团糟 我目前运行的是 RHEL6 5 64 位 事情是这样的 我安装了 perl 5 10 1 并且运行良好 这是安装好的 我可以从百胜看到它 我想安装 Padre 一个 Perl IDE 但这至少需
  • 删除查询字符串参数

    Is there any way to remove query string parameters from url in azure api management Thanks in advance 是的 您可以通过在发布者门户的操作屏
  • 角度锚标记单击的元素 ID 未显示

    我正在尝试获取单击的锚元素的 id 这是我的 HTML div class list group col md 4 a href class list group item img src book image alt p strong P
  • 如何在android文本视图的任意一端插入文本?

    是否可以有一个文本视图 其中在文本视图的最左侧包含一些文本 在文本视图的最右侧包含一些文本 例如 我想要一个应该像这样显示的文本视图 文字 a 可以使用单个 TextView 只需将文本放入 HTML 格式即可 例如
  • Firebase 动态链接无法获取参数

    我正在我的应用程序中处理邀请 我希望用户推荐其他人 推荐人将在他们推荐的人注册后获得奖励 我正在关注这个firebase 邀请教程 https firebase google com docs dynamic links use cases
  • 有没有办法运行查询并检查聚合数据而无需再次重新运行查询?

    在决定枚举 LINQ 查询的结果集之前 我想查看查询结果计数 可能还有其他聚合数据 几乎每个 LINQ 示例都会立即枚举 foreach 循环中的结果 但我想检查计数以确定是否需要循环每个结果 有没有办法运行查询并检查聚合数据而无需再次重新