FirstOrDefault () || Выберите (), что быстрее? - PullRequest
1 голос
/ 22 августа 2009

В общем, одна быстрее, чем другая, при условии, что возвращается 1 запись?

Есть ли преимущества использования одного над другим?

Просто в качестве примера:

DataContext.TableBlah.FirstOrDefault(_blah => _blah.id == 1);

или

var test = (from blah in TableBlah
            where blah.id == 1
            select blah)

Ответы [ 4 ]

2 голосов
/ 22 августа 2009

FirstOrDefault возвращается, как только находит результат, поэтому он может быть немного быстрее, но не на порядок ... В любом случае, ваш второй запрос может вернуть более одного результата, так что это не совсем справедливое сравнение. Вместо этого вы можете сравнить его с SingleOrDefault , который похож на Select, но возвращает только 1 результат.

SingleOrDefault, как и Select, должен пройти весь список, но он гарантирует, что вы получите один и только один результат.

Примечание. Если вы используете Linq to SQL, ваш второй запрос может быть быстрее, зависит от ваших индексов ...

2 голосов
/ 22 августа 2009
var test = (from blah in TableBlah
            where blah.id == 1
            select blah)

Может возвращать более 1 строки для соответствующих записей (в отличие от FirstOrDefault).

Производительность мудрая, я не думаю, что все должно быть иначе.
Это также зависит от количества строк в таблице? Индексный столбец проиндексирован?

1 голос
/ 22 августа 2009

Я на 90% уверен, что

var test = dc.TableBlah.FirstOrDefault(_blah => _blah.id == 1);

устанавливает то же дерево выражений, что и

var test = (from blah in dc.TableBlah
            where blah.id == 1
            select blah).FirstOrDefault();

Так что вашему второму примеру просто не хватает того, чтобы получить одну запись, позвонив по номеру FirstOrDefault(). С точки зрения производительности они будут идентичны.

Лично я бы вместо этого использовал SingleOrDefault(), так как вы ищете один элемент. SingleOrDefault() выбросит, если вы получите более одной записи.

1 голос
/ 22 августа 2009

Это потенциально может быть быстрее.

var test = (from blah in TableBlah
        where blah.id == 1
        select blah)

Это зависит от того, какого поставщика LINQ вы используете. Если вы используете LINQ to Sql или Subsonic и т. Д., Это может быть преобразовано в прямой вызов SQL, который будет извлекать только одну строку из БД.

В LINQ to Objects эти два оператора будут практически идентичны из-за потоковой передачи результатов LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...