O que LINQ retorna quando os resultados estão vazios

319

Eu tenho uma pergunta sobre a consulta LINQ. Normalmente, uma consulta retorna um IEnumerable<T>tipo. Se o retorno estiver vazio, não tenha certeza se é nulo ou não. Não tenho certeza se o seguinte ToList()irá lançar uma exceção ou apenas um vazio List<string>se nada for encontrado no IEnumerableresultado?

   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();

Eu sei que é uma pergunta muito simples, mas não tenho o VS disponível no momento.

David.Chu.ca
fonte
11
Eu acho que o resultado é Enumerable.Empty?
28920 David.Chu.ca

Respostas:

512

Ele retornará um enumerável vazio. Não será nulo. Você pode dormir som :)

leppie
fonte
38

Você também pode verificar o .Any()método:

if (!YourResult.Any())

Apenas uma observação que .Anyainda recuperará os registros do banco de dados; fazer a .FirstOrDefault()/.Where()será uma sobrecarga, mas você poderá capturar o (s) objeto (s) retornado (s) da consulta

Noich
fonte
5
Onde a pergunta menciona um banco de dados?
CJA
4
Você terá que perguntar a quem editou, eu não mencionou qualquer DB :)
Noich
O editor de pontos está produzindo som, no entanto, DB ou não. Eu acredito que eles estão dizendo que .Any()apenas lhe dirá se você possui algum registro correspondente, onde fazer uma consulta real para encontrar um valor específico pode ser nulo quando .Any()não estiver.
vapcguy
1
A edição pode estar realmente errada. Se estiver usando LINQ to Entities, a db pode atalho isso e nenhum dado está sendo enviado para o cliente, exceto um verdadeiro ou falso
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

(O despejo é do LinqPad )

JP Alioto
fonte
Exatamente! Você obtém uma melhor indicação dos resultados
netfed
TIL Count()é também um método, não apenas a propriedade
Heynow
2
Você não deve usar .Any () porque count será enumerado em todos os itens?
SHEePYTaGGeRNeP
16

.ToList retorna uma lista vazia. (o mesmo que a nova List ());

Paul van Brenk
fonte
8

No Linq-to-SQL, se você tentar obter o primeiro elemento em uma consulta sem resultados, obterá um sequence contains no elementserro. Posso garantir que o erro mencionado não é igual a object reference not set to an instance of an object. em conclusão não, ele não retornará nulo, pois null não pode dizer sequence contains no elementsque sempre será object reference not set to an instance of an object;)

kay.one
fonte
1
Ah, sua explicação ajuda a entender melhor. Obrigado !
Kay Lee
Isso responde à pergunta?
ChiefTwoPencils
7

Outras postagens aqui deixaram claro que o resultado é um IQueryable "vazio", que ToList () mudará corretamente para ser uma lista vazia etc.

Tenha cuidado com alguns dos operadores, pois eles serão lançados se você enviar um enumerável vazio. Isso pode acontecer quando você os une.

Spence
fonte
3
"Tenha cuidado com alguns dos operadores, pois eles serão lançados se você enviar um enumerável vazio. Isso pode acontecer quando você os liga". - Foi isso que me pegou. Eu tinha um valor retornado nulo que depois alimentei em outra consulta. Isso fez com que a segunda consulta fosse lançada, independentemente do que eu a convertesse, porque não havia valor sendo alimentado na segunda consulta.
trevorc
6

Não lançará exceção, você receberá uma lista vazia.

Jimmy Chandra
fonte