比较两个不同 LINQ 语句的效率
本文关键字:LINQ 语句 效率 两个 比较 | 更新日期: 2023-09-27 17:55:20
我正在学习C#(C++的背景),我有一个关于LINQ表达式的问题。以下两个函数都做同样的事情(据我所知)。袋熊的类型是System.Data.Linq.Table<Wombat>
.
我有兴趣知道
- 哪个效率更高?
- 这甚至重要吗?
- 相反,返回IQueryqble有什么收获吗?
- 这里有没有一些礼仪更喜欢三者之一?
我的猜测是,第二个更有效率,但除非袋熊桌上有数百万只袋熊,否则这并不重要。返回智商似乎并不重要,因为我们只返回一只袋熊。
提前感谢!
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 提供程序,以及它如何将其转换为 SQL。 您可以分析生成的 SQL(甚至只是检查 SQL 跟踪)并确定哪个更有效。
我怀疑大多数提供商使用第二个选项会做得更好,因为实际检查将是相同的类型 - 服务器上的查询不需要将每一行转换为字符串,并通过字符串比较进行比较。 这可能会使索引正常工作,并使其更加高效。 话虽如此,聪明的提供商可以为您进行此转换,在这种情况下,这两个选项可能是相同的。
你的猜测是正确的,第二个查询可能更有效,因为它会分析一次 GUID,而不是将每行中的 GUID 转换为字符串。查询提供程序可以对此进行优化,但并非必须这样做;查询提供程序也可能选择将 GUID 转换为字符串进行比较,但这将是一个相当不幸的选择。
假设除非表中有大量Wombat
对象,否则这无关紧要,这也是正确的。
查询有一个显著的区别:查询提供程序可能无法识别ToString
方法,因此由于运行时错误,第一个查询甚至不会执行。
- 查看为每个案例生成的 sql。
- 在 sql studio 中检查每个查询的执行时间、查询计划和 IO。
- ???
- 利润。
如果您返回 IQuerable,则可以延迟评估,允许其他人先更新值。