Linq to SQL - 什么更好?

时间:2010-05-13 10:09:58

标签: c# sql sql-server performance linq-to-sql

db.Albums.FirstOrDefault(x => x.OrderId == orderId)

db.Albums.FirstOrDefault(x => x.OrderId.Equals(orderId))

4 个答案:

答案 0 :(得分:9)

我打算说服你:

  • 您提出的两种方法可以提供相同的效果。
  • 至少有两个与性能无关的原因您应该更喜欢==
  • 您可以对代码进行另一项单独的改进,以减少出错的可能性。

要查看性能是否相同,请查看每种情况下生成的SQL。该测试程序向您展示了如何查看生成的SQL:

int orderId = 4;
TextWriter textWriter = new StringWriter();
using (var dc = new DataClasses1DataContext())
{
    dc.Log = textWriter;
    Order o1 = dc.Orders.FirstOrDefault(x => x.OrderId == orderId);
    Order o2 = dc.Orders.FirstOrDefault(x => x.OrderId.Equals(orderId));
}
string log = textWriter.ToString();

每种情况下发送的SQL都是相同的,您可以通过检查日志来看到:

SELECT TOP (1) [t0].[OrderId], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
WHERE [t0].[OrderId] = @p0

SELECT TOP (1) [t0].[OrderId], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
WHERE [t0].[OrderId] = @p0

关于是否使用==Equals,首先我建议使用==来提高可读性。这是比较C#中两个整数的惯用方法。

其次使用==如果给出不同(不兼容)类型的对象,则会出现编译时错误。我假设在你的情况下order有类型int,但我们假设其他人编写了这段代码,并且在orderOrder类型的变量而不是{{int的变量时意外发生错误1}}。现在让我们比较一下每种情况会发生什么:

Order order = new Order { OrderId = 4 };

x.OrderId.Equals(order)  // This compiles, but you get an exception at runtime:
                         // Could not format node 'Value' for execution as SQL.

x.OrderId == order       // Compile error: Operator '==' cannot be applied to
                         // operands of type 'int' and 'Order'

编译时错误比运行时错误更好,所以在这种情况下更喜欢使用==

最后,如果您只期望一个结果,您应该更喜欢使用SingleOrDefault而不是FirstOrDefault,因为如果找到两个匹配对象而不是仅返回第一个匹配对象,则前者将抛出异常。这种额外的检查会花费很少的性能,但同样可以让您更早地发现错误。如果性能对您来说是一个关键问题,那么您应该考虑一次从数据库中提取多个对象,而不是一次从一个对象中提取多个对象。

总而言之,我建议你使用它:

Album album = db.Albums.SingleOrDefault(x => x.OrderId == orderId);

答案 1 :(得分:7)

从绩效角度来看,它们都是等同的。我倾向于选择== over .Equals()来提高可读性,但L2S的优点在于你可以使用任何一种,具体取决于你拥有的对象类型。

(我假设您的第二个陈述是在orderId上,而不是订单对象)

答案 2 :(得分:1)

在大多数情况下,您应该得到相同的结果。但是,存在差异。

使用运算符Equals确定两个Object实例是否相同。 运算符==确定两个对象是否具有相同的值。

在这种情况下,我使用==运算符,因此它更具可读性。

答案 3 :(得分:0)

几乎相同。如果您只想检查值,则应使用

  

==

如果要检查值以及它们是否是相同的实例,请使用

  

等于

但在这两种情况下,结果时间几乎相同。