db.Albums.FirstOrDefault(x => x.OrderId == orderId)
或
db.Albums.FirstOrDefault(x => x.OrderId.Equals(orderId))
答案 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,但我们假设其他人编写了这段代码,并且在order
是Order
类型的变量而不是{{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)
几乎相同。如果您只想检查值,则应使用
==
如果要检查值以及它们是否是相同的实例,请使用
等于
但在这两种情况下,结果时间几乎相同。