db.Albums.FirstOrDefault(x => x.OrderId == orderId)
或者
db.Albums.FirstOrDefault(x => x.OrderId.Equals(orderId))
db.Albums.FirstOrDefault(x => x.OrderId == orderId)
或者
db.Albums.FirstOrDefault(x => x.OrderId.Equals(orderId))
==
。要查看性能是否相同,请查看每种情况下生成的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();
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
。现在让我们比较一下每种情况下会发生什么:
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);
从性能角度来看,它们都是等效的。我更喜欢使用==而不是.Equals(),因为后者更易读,但L2S的美妙之处在于你可以根据拥有的对象类型选择其中任何一个。
(我假设你的第二个语句是关于orderId而不是order对象)
==
取决于手头的实例吗? - Dan RosenstarkEquals
来确定两个对象实例是否相同。
操作符 ==
确定两个对象是否具有相同的值。==
操作符,因此更易读。x.Order == null
?如果是的话,.Equals
调用将失败,因为左侧没有有效的对象。 - Binary Worrier差不多一样。如果你只想检查值,那么应该使用
==
如果您想检查值以及它们是否为相同实例,请使用
Equals
但在这两种情况下,结果时间几乎相同。