Quando usar .Primeiro e quando usar .FirstOrDefault com LINQ?

Eu procurei por aí e realmente não encontrei uma resposta clara sobre quando você gostaria de usar .First e quando você gostaria de usar .FirstOrDefault com LINQ.

Eu usaria First() quando eu sei ou espero que a seqüência tenha pelo menos um elemento. Em outras palavras, quando é uma ocorrência excepcional, a seqüência está vazia.

Use FirstOrDefault() quando souber que você precisará verificar se havia um elemento ou não. Em outras palavras, quando é legal a seqüência estar vazia. Você não deve confiar no tratamento de exceções para a verificação. (É uma má prática e pode prejudicar o desempenho).

Finalmente, a diferença entre First() e Take() é que First() retorna o próprio elemento, enquanto Take() retorna uma seqüência de elementos que contém exatamente um elemento. (Se você passar 1 como parâmetro).

.First , .First uma exceção quando não há resultados. .FirstOrDefault não, simplesmente retornará null (tipos de referência) ou o valor padrão do tipo de valor. (por exemplo, como 0 para um int.) A questão aqui não é quando você quer o tipo padrão, mas mais: Você está disposto a lidar com uma exceção ou lidar com um valor padrão? Como as exceções devem ser excepcionais, o FirstOrDefault é preferido quando você não tem certeza se obterá resultados de sua consulta. Quando logicamente os dados devem estar lá, o tratamento de exceção pode ser considerado.

Skip() e Take() são normalmente usados ​​ao configurar a paginação nos resultados. (Como mostrar os primeiros 10 resultados e os próximos 10 na próxima página, etc.)

Espero que isto ajude.

.First () lançará 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).

Então, se você está preparado e disposto a lidar com uma possível exceção, o primeiro .First() está bem. Se você preferir verificar o valor de retorno para! = .FirstOrDefault() , 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.

Primeiro()

  1. Retorna o primeiro elemento de uma sequência.
  2. Ele lança um erro quando Não há nenhum elemento no resultado ou a origem é nula.
  3. você deve usá-lo, se mais de um elemento é esperado e você quer apenas o primeiro elemento.

FirstOrDefault ()

  1. Retorna o primeiro elemento de uma sequência ou um valor padrão se nenhum elemento for encontrado.
  2. Ele lança um erro somente se a fonte for nula.
  3. você deve usá-lo, se mais de um elemento é esperado e você quer apenas o primeiro elemento. Também é bom se o resultado estiver vazio.

Temos uma tabela UserInfos, que possui alguns registros conforme mostrado abaixo. Com base nesta tabela abaixo, criei o exemplo …

Tabela UserInfo

Como usar o primeiro ()

 var result = dc.UserInfos.First(x => x.ID == 1); 

Existe apenas um registro em que ID == 1. Devolve este registro
ID: 1 Nome: Manish Sobrenome: Dubey Email: xyz@xyz.com

 var result = dc.UserInfos.First(x => x.FName == "Rahul"); 

Existem vários registros onde FName == “Rahul”. Primeiro registro deve ser retorno.
ID: 7 Primeiro Nome: Rahul Sobrenome: Sharma Email: xyz1@xyz.com

 var result = dc.UserInfos.First(x => x.ID ==13); 

Não há registro com ID == 13. Um erro deve ocorrer.
InvalidOperationException: sequência não contém elementos

Como usar FirstOrDefault ()

 var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1); 

Existe apenas um registro em que ID == 1. Devolve este registro
ID: 1 Nome: Manish Sobrenome: Dubey Email: xyz@xyz.com

 var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul"); 

Existem vários registros onde FName == “Rahul”. Primeiro registro deve ser retorno.
ID: 7 Primeiro Nome: Rahul Sobrenome: Sharma Email: xyz1@xyz.com

 var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13); 

Não há registro com ID == 13. O valor de retorno é nulo

Espero que ele ajude você a entender quando usar First() ou FirstOrDefault() .

Primeiro de tudo, Take é um método completamente diferente. Ele retorna um IEnumerable e não um único T , então está fora.

Entre First e FirstOrDefault , você deve usar First quando tiver certeza de que um elemento existe e, se não existir, haverá um erro.

By the way, se sua seqüência contém elementos default(T) (por exemplo, null ) e você precisa distinguir entre estar vazio eo primeiro elemento sendo null , você não pode usar FirstOrDefault .

Primeiro:

  • Retorna o primeiro elemento de uma sequência
  • Lança exceção: não há elementos no resultado
  • Use quando: Quando mais de um elemento é esperado e você quer apenas o primeiro

FirstOrDefault:

  • Retorna o primeiro elemento de uma sequência ou um valor padrão se nenhum elemento for encontrado
  • Lança exceção: somente se a fonte for nula
  • Use quando: Quando mais de um elemento é esperado e você deseja apenas o primeiro. Também está tudo bem para o resultado estar vazio

De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

Outra diferença a notar é que, se você estiver depurando um aplicativo em um ambiente de Produção, talvez não tenha access a números de linha, portanto, identificar a instrução .First() em um método que gerou a exceção pode ser difícil.

A mensagem de exceção também não includeá nenhuma expressão do Lambda que você possa ter usado, o que tornaria qualquer problema ainda mais difícil de depurar.

É por isso que sempre uso FirstOrDefault() mesmo sabendo que uma input nula constituiria uma situação excepcional.

 var customer = context.Customers.FirstOrDefault(i => i.Id == customerId); if (customer == null) { throw new Exception(string.Format("Can't find customer {0}.", customerId)); } 

Eu encontrei um site que apperars 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ê quiser chamar First () ou Single () para obter uma única linha … Você receberá uma exceção “Sequence contains no elements”.

Disclaimer: Eu nunca usei LINQ, então minhas desculpas se isso está fora do alvo.

Primeiro()

Quando você sabe que o resultado contém mais de um elemento esperado e você deve apenas o primeiro elemento da seqüência.

FirstOrDefault ()

FirstOrDefault () é exatamente 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 for encontrado. Mas a coleta de elemento ou uma sequência é nula do que gera uma exceção.

 someList.First(); // exception if collection is empty. someList.FirstOrDefault(); // first item or default(Type) 

Qual deles usar? Deve ser decidido pela lógica de negócios e não pelo medo da falha de exceção / programa.

Por exemplo, se a lógica de negócios diz que não podemos ter zero transactions em qualquer dia de trabalho (apenas suponha). Então você não deve tentar lidar com esse cenário com alguma programação inteligente. Sempre usarei First () sobre essa coleção e deixarei o programa falhar se algo estragar a lógica de negócios.

Código:

 var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay(); var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault() 

Eu gostaria de ver outros comentários sobre isso.

Ok, deixe-me dar meus dois centavos. First / Firstordefault são para quando você usa o segundo construtor. Eu não vou explicar o que é, mas é quando você potencialmente sempre usa um porque você não quer causar uma exceção.

 person = tmp.FirstOrDefault(new Func((p) => { return string.IsNullOrEmpty(p.Relationship); })); 

Este tipo de function pertence aos operadores de elementos. Alguns operadores de elementos úteis são definidos abaixo.

  1. First / FirstOrDefault
  2. Last / LastOrDefault
  3. Single / SingleOrDefault

Usamos operadores de elementos quando precisamos selecionar um único elemento de uma sequência com base em uma determinada condição. Aqui está um exemplo.

  List items = new List() { 8, 5, 2, 4, 2, 6, 9, 2, 10 }; 

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 resultado = itens.Onde (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 ();

linq muitas maneiras de implementar consulta única simples em collections, só escrevemos joins em sql, um filtro pode ser aplicado em primeiro ou último, dependendo da necessidade e necessidade.

Aqui está um exemplo onde podemos encontrar um elemento com um id em uma coleção. Para adicionar mais sobre isso, methods First, FirstOrDefault , idealmente retornariam mesmo quando uma coleção tiver pelo menos um registro. Se, no entanto, uma coleção estiver ok para estar vazia. então First retornará uma exceção, mas FirstOrDefault retornará null ou default. Por exemplo, int retornará 0. Assim, o uso de tais é, embora seja uma preferência pessoal, mas é melhor usar FirstOrDefault para evitar o tratamento de exceções. aqui é um exemplo onde, nós corremos mais de uma coleção de lista de transações