Что возвращает LINQ, когда результаты пусты?


319

У меня вопрос по поводу запроса LINQ. Обычно запрос возвращает IEnumerable<T>тип. Если возврат пустой, не уверен, что он нулевой или нет. Я не уверен, будет ли следующее ToList()исключение или просто пустым, List<string>если ничего не найдено в IEnumerableрезультате?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Я знаю, что это очень простой вопрос, но у меня пока нет VS.


11
Я думаю, что результат Enumerable.Empty?
David.Chu.ca

Ответы:


512

Он вернет пустой перечислимый. Это не будет нулевым. Вы можете спать спокойно :)


38

Вы также можете проверить .Any()метод:

if (!YourResult.Any())

Просто примечание, которое .Anyвсе равно будет извлекать записи из базы данных; выполнение a .FirstOrDefault()/.Where()будет таким же накладным расходом, но тогда вы сможете поймать объект (ы), возвращенный из запроса


5
Где в вопросе упоминается база данных?
cja

4
Вы должны спросить того, кто редактировал, я не упомянул ни одной БД :)
Noich

Точка редактора звучит, правда, БД или нет. Я полагаю, что они говорят, .Any()что просто скажут вам, есть ли у вас какие-либо совпадающие записи, где выполнение фактического запроса для поиска определенного значения может быть нулевым, если .Any()нет.
vapcguy

1
Редактирование может быть на самом деле неправильно. При использовании linq для сущностей, база данных может сократить это, и никакие данные вообще не отправляются клиенту, кроме true или false
Mafii

19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(Дамп от LinqPad )


Именно! Вы получите лучшее представление о результатах
16:53

TIL Count()- это тоже метод, а не просто свойство
heyNow

2
Разве вы не должны использовать .Any (), потому что count будет перечислять все элементы?
SHEePYTaGGeRNeP


8

В Linq-to-SQL, если вы попытаетесь получить первый элемент запроса без результатов, вы получите sequence contains no elementsошибку. Я могу заверить вас, что упомянутая ошибка не равна object reference not set to an instance of an object. в заключение нет, он не вернет ноль, так как нуль не может сказать, sequence contains no elementsчто всегда будет говорить object reference not set to an instance of an object;)


1
О, ваше объяснение помогает дальнейшему пониманию. Спасибо !
Кей Ли,

Это отвечает на вопрос?
ChiefTwoPencils

7

Другие посты здесь прояснили, что результатом является «пустой» IQueryable, который ToList () будет правильно менять на пустой список и т. Д.

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


3
«Будьте осторожны с некоторыми из операторов, так как они сгенерируют, если вы отправите им перечислимое пустое число. Это может произойти, когда вы объедините их вместе». - Это то, что меня достало. У меня было нулевое возвращаемое значение, которое я затем передал в другой запрос. Это вызвало выброс второго запроса независимо от того, к чему я его приводил, потому что во втором запросе не было значения.
Trevorc

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.