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.


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 :)


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


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 )


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


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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.