Linq к SQL - что лучше?

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

или

db.Albums.FirstOrDefault(x => x.OrderId.Equals(orderId))
5
задан Steven 13 May 2010 в 10:27
поделиться

4 ответа

Они оба будут эквивалентны с точки зрения производительности. Я предпочитаю == .Equals () для удобочитаемости, но прелесть L2S в том, что вы можете использовать любой из них, в зависимости от того, какой у вас тип объекта.

(И я предполагаю, что ваш второй оператор находится в orderId, а не в объекте заказа)

7
ответ дан 18 December 2019 в 09:48
поделиться

Это почти то же самое. Если вы хотите проверить только значение, вы должны использовать

==

Если вы хотите проверить значение, а также, являются ли они одними и теми же экземплярами или нет, используйте

Equals

Но в обоих случаях результирующее время почти то же самое.

0
ответ дан 18 December 2019 в 09:48
поделиться

Я попытаюсь убедить вас, что:

  • Два предложенных вами метода дают одинаковую производительность.
  • Есть как минимум две причины, не связанные с производительностью, которые вы должны предпочесть == .
  • Есть еще одно отдельное улучшение, которое вы можете внести в свой код, чтобы уменьшить вероятность ошибок.

Чтобы увидеть, что производительность будет одинаковой, посмотрите на 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

Относительно того, использовать ли == или Равно , сначала я бы предложил использовать == для удобства чтения. Это идиоматический способ сравнения двух целых чисел в 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);
9
ответ дан 18 December 2019 в 09:48
поделиться

В большинстве ситуаций вы должны получить тот же результат. Однако есть разница.

Использование оператора Equals определяет, являются ли два экземпляра Object одинаковыми. Оператор == определяет, имеют ли два объекта одинаковое значение.

В этом случае я использую оператор == , чтобы он был более читабельным.

1
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: