2016-10-11 1 views
1

Когда таблица пуста, я думаю, что все три исполнения аналогичны времени. Но не уверен, каково будет влияние производительности, когда таблица имеет миллион записей.Правильная опция для дескриптора MAX(), когда таблица пуста?

1. Исходный запрос не влияет, но не нравится, потому что нужно сделать два разделенных справки db.

2. Не нравится, потому что, когда ни одна пустая таблица не должна приводить все строки вместо использования индекса, чтобы найти max.

3. Ну, это должно возвращать null вместо повышения ошибки.

long? LastInsertedID; 

try 
{ 
    LastInsertedID = db.myTable.Any() ? 
         db.myTable.Max(p => p.id) 
        : 0; 

    LastInsertedID = db.myTable.Select(p => p.id) 
          .DefaultIfEmpty(0) 
          .Max(); 

    LastInsertedID = db.myTable.Max(p => p.id); -- cause Exception 
} 

Исключение:

{ "Бросок к типу значения„System.Int64“не удалось, так как материализованная значение равно нулю либо универсальный параметр типа результата или запрос должен использовать обнуляемого тип.. "}

+0

Что такое тип 'id'? Я думал, что это приведет к тому, что исключение «sequence contains no items» –

+0

в db не равно NULL длинному целому числу, но проблема в том, что db пуст. –

ответ

3

IMO рабочий третий вариант является лучшим. Запросы базы данных возвращают null для большинства функций агрегата (кроме COUNT), когда набор пуст, так же как и предложение сообщения об исключении.

Все, что вам нужно, это включить приведение к соответствующему типу обнуляемого:

LastInsertedID = db.myTable.Max(p => (long?)p.id); 
+1

Doh. Клянусь, я пытаюсь дублировать вопрос с этим же предложением и даже не компилирую, даже комментирую его, потому что hardt был другим lenguaje от C#. Теперь работает отлично: /. TY –

1

Второй вариант лучше. Вы избегаете множественных ударов базы данных (или попаданий в коллекцию в целом), это яснее, и это не может потерпеть неудачу.

+0

Но разве SELECT не выводит все записи из db на клиент, а затем вычисляет 'MAX' локально? –

+0

Я так не думаю, нет. Он должен переводить все, что может, в фактический SQL. Это может зависеть от вашего провайдера и его реализации. – robhol

+0

запустите обработчик sql и проверьте сгенерированный запрос. – Javier