5

我正在学习 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);
    }
4

4 回答 4

7

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

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

于 2013-01-23T17:10:20.890 回答
5

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

您还正确地假设除非表中有大量Wombat对象,否则这无关紧要。

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

于 2013-01-23T17:08:37.840 回答
3
  1. 查看每种情况下生成的 sql。
  2. 检查sql studio中每个查询的执行时间、查询计划和IO。
  3. ???
  4. 利润。
于 2013-01-23T17:10:27.080 回答
1

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

于 2013-01-23T17:08:17.807 回答