Что возвращает 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.

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

Ответы:

512

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

leppie
источник
38

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

if (!YourResult.Any())

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

Noich
источник
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 )

JP Alioto
источник
Именно! Вы получите лучшее представление о результатах
16:53
TIL Count()- это тоже метод, а не просто свойство
heyNow
2
Разве вы не должны использовать .Any (), потому что count будет перечислять все элементы?
SHEePYTaGGeRNeP
16

.ToList возвращает пустой список. (так же, как новый список ());

Пол ван Бренк
источник
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
6

Это не будет исключение, вы получите пустой список.

Джимми Чандра
источник