我正在学习C#(C ++中的背景),我对LINQ表达式有疑问。以下两个函数都做同样的事情(尽我所知)。袋熊的类型是System.Data.Linq.Table<Wombat>
。
我很想知道
我的猜测是第二种效率更高,但除非在袋熊桌中有数百万只袋熊,否则它并不重要。返回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);
}
答案 0 :(得分:7)
这完全取决于DB的LINQ提供程序,以及它如何将其转换为SQL。您可以profile the resulting SQL(甚至只是inspecting the SQL trace)并确定哪个更有效。
我怀疑大多数提供商会使用第二个选项做得更好,因为实际检查将是相同的类型 - 服务器上的查询不需要将每一行转换为字符串,并通过字符串比较进行比较。这可能会使索引工作正常,并使其更有效。话虽这么说,一个聪明的提供者可以为你做这个转换,在这种情况下,两个选项可能是相同的。
答案 1 :(得分:5)
您的猜测是正确的,第二个查询可能更有效,因为它会解析GUID一次而不是将每行中的GUID转换为字符串。查询提供程序可以优化它,但它不必;您的查询提供程序也可能会选择将GUID转换为字符串进行比较,但这将是一个相当不幸的选择。
除非表中有大量Wombat
个对象,否则你也无误。
第二个查询有一个显着的区别:查询提供程序可能无法识别ToString
方法,因此由于运行时错误,您的第一个查询甚至无法执行。
答案 2 :(得分:3)
答案 3 :(得分:1)
如果您返回IQueryable,您可以延迟评估,允许其他人先更新该值。