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

时间:2013-01-23 17:04:44

标签: c# linq

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

我很想知道

  1. 哪个更有效?
  2. 甚至重要吗?
  3. 返回IQueryqble会有什么好处吗?
  4. 这里有一些礼仪更喜欢三个中的一个吗?
  5. 我的猜测是第二种效率更高,但除非在袋熊桌中有数百万只袋熊,否则它并不重要。返回IQueryable并不重要,因为我们只返回一个袋熊。

    提前致谢!

        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);
        }
    

4 个答案:

答案 0 :(得分:7)

这完全取决于DB的LINQ提供程序,以及它如何将其转换为SQL。您可以profile the resulting SQL(甚至只是inspecting the SQL trace)并确定哪个更有效。

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

答案 1 :(得分:5)

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

除非表中有大量Wombat个对象,否则你也无误。

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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