2017-02-16 9 views
1

Я просматриваю код и вижу что-то подозрительное.Можно выбрать анонимный тип null?

В фотке внизу можно ever be NULL?

 var result = (from number in _cmContext.SrvLocationWarmLine 
         where String.Compare(number.CurrentWarmLine, startingRange, StringComparison.Ordinal) >= 0 
          && String.Compare(number.CurrentWarmLine, endingRange, StringComparison.Ordinal) <= 0 
         orderby number.CurrentWarmLine descending 
         select new { Number = number.CurrentWarmLine }).FirstOrDefault(); 

В более общем плане: при применении FirstOrDefault против выбора, может результат когда-либо быть пустым?

+0

Конечно, это может быть null. Какая у вас проблема? –

+0

Я бы предположил, что если 'from' и' where' возвращают ноль, результат '' будет 'null' или исключение будет выбрано на' orderby' – TheLethalCoder

+0

Да, но для вашего случая вы выбрали бы исключение " В экземпляре объекта не задана ссылка на объект." когда число равно null, и вы пытаетесь получить к нему доступ. –

ответ

3

Да. Значение result равно null, если последовательность пуста.
Это происходит, если number в _cmContext.SrvLocationWarmLine соответствует этому условию в предложении where.


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

FirstOrDefault<T>(this IEnumerable<T>, Predicate<T>) возвращает null, если в последовательности, соответствующей предикату, нет элемента.


Обратите внимание, что select в синтаксисе запроса переводится в вызове метода Select(...).

Редактирование: конечно, вышеизложенное применяется только в том случае, если тип элементов конечной последовательности является ссылочным типом. Для типов значений результат будет равен default(type), например. 0 для int.

+0

Не исключено ли исключение, я уверен, что у меня есть исключение в соответствии с: Последовательность не содержит элементов ", пытаясь сделать порядок на пустой последовательности? – TheLethalCoder

+0

@TheLethalCoder не было бы никаких исключений. Только 'First()' (без 'OrDefault') выбрасывает пустые последовательности, а также' Single() '. И 'SingleOrDefault()' бросает, если имеется более одного (совпадающего) элемента. –

+0

Я знаю, что это не было бы брошено на 'FirstOrDefault', это было больше о вызове' orderby', но Servy ответил на этот вопрос выше. – TheLethalCoder