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

Ben*_*dee 5 c# linq

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

我很想知道

  1. 哪个更有效率?
  2. 它甚至重要吗?
  3. 返回IQueryqble可以获得一些东西吗?
  4. 这里有一些礼仪更喜欢三个中的一个吗?

我的猜测是第二种效率更高,但除非袋熊桌上有数百万只袋熊,否则它并不重要.返回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);
    }
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 7

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

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


das*_*ght 5

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

假设除非表中有大量Wombat对象,否则你也是正确的.

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

  • 这取决于查询提供程序的功能.请记住,这是一个`IQueryable <T>` - 它不像编写*的代码*将被执行. (5认同)