Pesquisei e não encontrei uma resposta clara sobre quando .First
e o que usar .FirstOrDefault
com o LINQ.
Quando você gostaria de usar
.First
? Somente quando você deseja capturar a exceção se nenhum resultado for retornado?var result = List.Where(x => x == "foo").First();
E quando você gostaria de usar
.FirstOrDefault
? Quando você sempre deseja o tipo padrão, se não houver resultado?var result = List.Where(x => x == "foo").FirstOrDefault();
E, quanto a isso, e o Take?
var result = List.Where(x => x == "foo").Take(1);
.First
e.FirstOrDefault
ambos os predicados tomar como argumentos, por isso,var result = List.Where(x => x == "foo").First();
poderia ser reescrita comovar result = List.First(x => x == "foo");
Single
eSingleOrDefault
. Eu odeio quando as pessoas usamFirst
quando realmente querem dizerSingle
; ).FirstOrDefault()
sempre oferece a oportunidade de lançar uma exceção mais significativa. Se uma exceção de sequência for lançada e mais de uma.First()
em um método, pode ser difícil discernir qual instrução é o problema.Respostas:
Eu usaria
First()
quando sei ou espero que a sequência tenha pelo menos um elemento. Em outras palavras, quando é uma ocorrência excepcional que a sequência está vazia.Use
FirstOrDefault()
quando souber que precisará verificar se havia um elemento ou não. Em outras palavras, quando é legal que a sequência esteja vazia. Você não deve confiar no tratamento de exceções para a verificação. (É uma prática ruim e pode prejudicar o desempenho).Finalmente, a diferença entre
First()
eTake(1)
é queFirst()
retorna o próprio elemento, enquantoTake(1)
retorna uma sequência de elementos que contém exatamente um elemento.fonte
.First
lançará uma exceção quando não houver resultados..FirstOrDefault
não, simplesmente retornará nulo (tipos de referência) ou o valor padrão do tipo de valor. (por exemplo, como0
para um int.) A questão aqui não é quando você deseja o tipo padrão, mas mais: você está disposto a lidar com uma exceção ou com um valor padrão? Como as exceções devem ser excepcionais,FirstOrDefault
é preferível quando você não tem certeza se deseja obter resultados de sua consulta. Quando logicamente os dados devem estar lá, o tratamento de exceções pode ser considerado.Skip()
eTake()
são normalmente usados ao configurar a paginação nos resultados. (Como mostrar os 10 primeiros resultados e os próximos 10 na página seguinte etc.)Espero que isto ajude.
fonte
.FirstOrDefault
retornará nulo para tipos de referência. Eu estava confuso sobre o que seria um objeto "padrão". Esta resposta esclareceu isso..First()
emitirá uma exceção se não houver nenhuma linha a ser retornada, enquanto.FirstOrDefault()
retornará o valor padrão (NULL
para todos os tipos de referência).Portanto, se você estiver preparado e disposto a lidar com uma possível exceção, tudo
.First()
bem. Se você preferir verificar o valor de retorno de!= null
qualquer maneira, então.FirstOrDefault()
é sua melhor escolha.Mas acho que também é uma preferência pessoal. Use o que fizer mais sentido para você e se adapte melhor ao seu estilo de codificação.
fonte
Primeiro()
FirstOrDefault ()
Temos uma tabela UserInfos, que possui alguns registros, como mostrado abaixo. Com base nesta tabela abaixo, criei um exemplo ...
Como usar o First ()
Há apenas um registro em que ID == 1. Deve retornar esse
ID de registro : 1 Nome: Manish Sobrenome: Dubey Email: [email protected]
Existem vários registros em que FName == "Rahul". O primeiro registro deve ser retornado.
ID: 7 Nome: Rahul Sobrenome: Sharma E-mail: [email protected]
Não há registro com o ID == 13. Um erro deve ocorrer.
InvalidOperationException: Sequence não contém elementos
Como usar FirstOrDefault ()
Há apenas um registro em que ID == 1. Deve retornar esse
ID de registro : 1 Nome: Manish Sobrenome: Dubey Email: [email protected]
Existem vários registros em que FName == "Rahul". O primeiro registro deve ser retornado.
ID: 7 Nome: Rahul Sobrenome: Sharma E-mail: [email protected]
Não há registro com o ID == 13. O valor de retorno é nulo
Espero que ajude você a entender quando usar
First()
ouFirstOrDefault()
.fonte
Primeiro de tudo,
Take
é um método completamente diferente. Ele retorna umIEnumerable<T>
e não umT
, então está pronto.Entre
First
eFirstOrDefault
, você deve usarFirst
quando tiver certeza de que um elemento existe e, se não existir, ocorrerá um erro.A propósito, se sua sequência contiver
default(T)
elementos (por exemplonull
) e você precisar distinguir entre estar vazio e o primeiro elementonull
, não poderá usá-loFirstOrDefault
.fonte
Primeiro:
FirstOrDefault:
De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
fonte
Outra diferença a ser observada é que, se você estiver depurando um aplicativo em um ambiente de Produção, poderá não ter acesso aos números das linhas, identificando quais
.First()
pode ser difícil instrução em um método lançou a exceção.A mensagem de exceção também não incluirá nenhuma expressão Lambda que você possa ter usado, o que tornaria qualquer problema ainda mais difícil de depurar.
É por isso que eu sempre uso,
FirstOrDefault()
mesmo sabendo que uma entrada nula constituiria uma situação excepcional.fonte
Primeiro()
Quando você souber que o resultado contém mais de 1 elemento esperado e você deve apenas o primeiro elemento da sequência.
FirstOrDefault ()
FirstOrDefault () é como First (), exceto que, se nenhum elemento corresponder à condição especificada, ele retornará o valor padrão do tipo subjacente da coleção genérica. Não lança InvalidOperationException se nenhum elemento encontrado. Mas a coleção de elemento ou uma sequência é nula do que gera uma exceção.
fonte
Este tipo de função pertence aos operadores de elemento. Alguns operadores de elementos úteis são definidos abaixo.
Usamos operadores de elemento quando precisamos selecionar um único elemento de uma sequência com base em uma determinada condição. Aqui está um exemplo.
O operador First () retorna o primeiro elemento de uma sequência após satisfazer a condição. Se nenhum elemento for encontrado, ele lançará uma exceção.
int result = items.Where (item => item == 2) .Primeiro ();
O operador FirstOrDefault () retorna o primeiro elemento de uma sequência após satisfazer a condição. Se nenhum elemento for encontrado, ele retornará o valor padrão desse tipo.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
fonte
Encontrei um site que funciona para explicar a necessidade de FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Se não houver resultados para uma consulta e você desejar ligar para First () ou Única () para obter uma única linha ... Você receberá uma exceção "Sequência não contém elementos".
Isenção de responsabilidade: nunca usei o LINQ, portanto, desculpe-me se isso estiver errado.
fonte
Qual usar? Deve ser decidido pela lógica de negócios, e não pelo medo de falha na exceção / programa.
Por exemplo, se a lógica de negócios disser que não podemos ter zero transações em nenhum dia útil (suponha). Então você não deve tentar lidar com esse cenário com alguma programação inteligente. Eu sempre usarei First () nessa coleção e deixarei o programa falhar se algo mais estragar a lógica do negócio.
Código:
Eu gostaria de ver outros comentários sobre isso.
fonte
Ok, deixe-me dar meus dois centavos. First / Firstordefault são para quando você usa o segundo construtor. Não vou explicar o que é, mas é quando você sempre usa um potencial porque não deseja causar uma exceção.
fonte
Outros descreveram muito bem a diferença entre
First()
eFirstOrDefault()
. Quero dar mais um passo na interpretação da semântica desses métodos. Na minha opinião,FirstOrDefault
está sendo muito usado em demasia. Na maioria dos casos, ao filtrar dados, você espera recuperar uma coleção de elementos que correspondam à condição lógica ou um único elemento único por seu identificador exclusivo - como usuário, livro, publicação etc. por que podemos chegar ao ponto de dizer queFirstOrDefault()
é um cheiro de código, não porque há algo errado com ele, mas porque está sendo usado com muita frequência. Esta postagem no blog explora o tópico em detalhes. IMO na maioria das vezesSingleOrDefault()
é uma alternativa muito melhor, portanto, preste atenção a esse erro e use o método mais apropriado que represente claramente seu contrato e expectativas.fonte
No linq, de várias maneiras para implementar uma consulta simples e simples em coleções, basta escrever junções no sql, um filtro pode ser aplicado primeiro ou por último, dependendo da necessidade e necessidade.
Aqui está um exemplo em que podemos encontrar um elemento com um ID em uma coleção. Para adicionar mais detalhes, os métodos First,
FirstOrDefault
retornariam o mesmo ideal quando uma coleção tiver pelo menos um registro. Se, no entanto, é aceitável uma coleção estar vazia. Em seguidaFirst
, retornará uma exceção, masFirstOrDefault
retornaránull
ou o padrão. Por exemplo,int
retornará 0. Portanto, o uso de tal é considerado preferência pessoal, mas é melhor usá-loFirstOrDefault
para evitar o tratamento de exceções.fonte