【问题标题】:LINQ Count .. best methodLINQ Count .. 最佳方法
【发布时间】:2010-06-30 21:40:44
【问题描述】:

我的公司刚刚开始使用 LINQ,但我仍然对 LINQ 命令和 SQL 的抽象性(如果这是一个词)有点麻烦,我的问题是

  Dim query = (From o In data.Addresses _
                    Select o.Name).Count

在我的脑海中,SQL 正在返回所有行,并且对 IQueryable 结果中的行数进行计数,所以我会更好

    Dim lstring = Aggregate o In data.Addresses _
    Into Count()

或者我是否过度思考 LINQ 的工作方式?在家里使用 VB Express,所以我看不到发送到数据库的实际 SQL(我认为),因为我无权访问 SQL 分析器

【问题讨论】:

  • 完全不是一个骗子(零从属关系),我建议你看看 LINQPad - linqpad.net 它允许你查看从 LINQ 到 SQL 表达式生成的 SQL,对于 VB 和C#,使得在不重新构建/重新运行的情况下处理查询 sn-ps 变得更加容易。
  • @Marc 谢谢,这让我可以自己回答这个问题....不错的工具....ps,让它成为一个答案,以便我可以打勾:-)

标签: vb.net linq performance


【解决方案1】:

如前所述,它们在功能上是等效的,只是使用查询语法。

正如我在评论中提到的,如果您将以下内容评估为LINQPad 中的 VB 语句:

Dim lstring = Aggregate o In Test _
    Into Count()

您可以在生成的 SQL 输出窗口中看到:

SELECT COUNT(*) AS [value]
FROM [Test] AS [t0]

这与评估的以下 VB LINQ 表达式相同:

(From o In Test_
    Select o.Symbol).Count

你得到完全相同的结果。

【讨论】:

    【解决方案2】:

    我不熟悉Visual Basic,但基于

    http://msdn.microsoft.com/en-us/library/bb546138.aspx

    这两种方法是相同的。一种使用方法语法,另一种使用查询语法。

    您可以在查询运行时使用 SQL Profiler 确定。

    PS - LINQ 的“要点”是您可以轻松地进行查询操作,而无需离开代码/VB 领域。

    【讨论】:

    • 干杯,但从那我看不到它谈论.Count,目前使用快递,所以无法访问分析器(必须花钱).. PS 我得到了你的 PS ,应该说“或者我不理解 LINQ 的工作方式”
    【解决方案3】:

    这里很重要的一点是,您提供的代码将适用于各种数据源。它有望以一种非常有效的方式做到这一点,尽管不能完全保证。它肯定会使用 SQL 源以一种有效的方式完成(被转换为 SELECT COUNT(*) SQL 查询。如果源是内存中的集合,它将被有效地完成(它被转换为调用 Count 属性) . 如果源是不是集合的可枚举(在这种情况下,它确实会读取所有内容并计数),但在这种情况下确实没有更有效的方法来做到这一点.

    在每种情况下,它都以最有效的方式完成了相同的概念操作,而您不必担心细节。计数没什么大不了的,但在更复杂的情况下更重要。

    在某种程度上,当您说“在我看来,SQL 正在返回所有行并且对行数进行计数”时,您是对的。 从概念上讲这就是该查询中发生的事情,但实现可能会有所不同。与 SQL 中的实际查询可能与 SQL 命令的字面解释不匹配,以便选择最有效的方法。

    【讨论】:

    • 谢谢乔恩,我认为我在上个月左右使用 LinQ 学到的一件事是不要假设正在生成的 SQL 是什么(并且远离任何 iQueryable 对象类型作为尽可能长)
    • 是的。确实,有时当我确实查看生成的 SQL 时,它似乎有点奇怪,然后进入下一层并查看查询计划表明,实际上,LINQ 生成的 SQL 比更明显的方法要好。值得一看的是产生的 SQL,尤其是。对于更复杂或经常命中的查询,您可以通过适当的索引和统计信息来帮助它。
    【解决方案4】:

    我认为你错过了这一点,因为带有 SQL 的 Linq 具有后期绑定,所以当你说我需要计数时,就会创建一个查询。

    在此之前,Linq for SQL 创建表达式树,在您需要时将其“翻译”成 SQL....

    http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

    如何调试见 Scott http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx
    (来源:scottgu.com

    【讨论】:

    • 这能回答上面的问题吗?
    • 对不起,我问这个问题的原因是,当我将 dubugger 或 .string 放在“Dim query = (From o In data.Addresses Select o.Name).Count”上时,我得到 2这是结果,当我对另一个查询执行相同操作时,我得到了预期的“选择计数(*)”sql,所以我倾向于后者更好....但是因为我无法访问探查器,我无法确定
    • 尝试在上下文对象上使用日志记录 .... codeproject.com/KB/linq/LINQ2Log4Net.aspx
    • 最好的学习工具是 LinqPad linqpad.net 或使用调试窗口 var sw = new System.IO.StringWriter(); db.Log = sw;见damieng.com/blog/2008/07/30/…
    • 另一个讨论计数的堆栈流条目stackoverflow.com/questions/1651301/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2012-11-30
    • 2010-10-14
    • 1970-01-01
    • 2022-07-21
    • 2012-05-02
    相关资源
    最近更新 更多