比较两个不同 LINQ 语句的效率

本文关键字:LINQ 语句 效率 两个 比较 | 更新日期: 2023-09-27 17:55:20

我正在学习C#(C++的背景),我有一个关于LINQ表达式的问题。以下两个函数都做同样的事情(据我所知)。袋熊的类型是System.Data.Linq.Table<Wombat>.

我有兴趣知道

  1. 哪个效率更高?
  2. 这甚至重要吗?
  3. 相反,返回IQueryqble有什么收获吗?
  4. 这里有没有一些礼仪更喜欢三者之一?

我的猜测是,第二个更有效率,但除非袋熊桌上有数百万只袋熊,否则这并不重要。返回智商似乎并不重要,因为我们只返回一只袋熊。

提前感谢!

    public static DBConnector.Connections.Wombat getWombat(String wombatID)
    {
        var db = getDBInstance();
        return db.Wombats.FirstOrDefault(x => x.ID.ToString() == wombatID);
    }
    public static DBConnector.Connections.Wombat getWombat(String wombatID)
    {
        var db = getDBInstance();
        var guid = new System.Guid(wombatID);
        return db.Wombats.FirstOrDefault(x => x.ID == guid);
    }

比较两个不同 LINQ 语句的效率

这将完全取决于数据库的 LINQ 提供程序,以及它如何将其转换为 SQL。 您可以分析生成的 SQL(甚至只是检查 SQL 跟踪)并确定哪个更有效。

我怀疑大多数提供商使用第二个选项会做得更好,因为实际检查将是相同的类型 - 服务器上的查询不需要将每一行转换为字符串,并通过字符串比较进行比较。 这可能会使索引正常工作,并使其更加高效。 话虽如此,聪明的提供商可以为您进行此转换,在这种情况下,这两个选项可能是相同的。

你的猜测是正确的,第二个查询可能更有效,因为它会分析一次 GUID,而不是将每行中的 GUID 转换为字符串。查询提供程序可以对此进行优化,但并非必须这样做;查询提供程序也可能选择将 GUID 转换为字符串进行比较,但这将是一个相当不幸的选择。

假设除非表中有大量Wombat对象,否则这无关紧要,这也是正确的。

第二个

查询有一个显著的区别:查询提供程序可能无法识别ToString方法,因此由于运行时错误,第一个查询甚至不会执行。

  1. 查看为每个案例生成的 sql。
  2. 在 sql studio 中检查每个查询的执行时间、查询计划和 IO。
  3. ???
  4. 利润。

如果您返回 IQuerable,则可以延迟评估,允许其他人先更新值。