it-swarm-pt.tech

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.

  • Quando você gostaria de usar .First? Somente quando você quiser pegar a exceção se nenhum resultado for retornado?

    var result = List.Where(x => x == "foo").First();
    
  • E quando você quer usar .FirstOrDefault? Quando você sempre quer o tipo padrão se não tiver resultado?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • E para esse assunto, e quanto a Take?

    var result = List.Where(x => x == "foo").Take(1);
    
758
Metro Smurf

Eu usaria First() quando souber ou esperar que a sequê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 o cheque. (É uma má prática e pode prejudicar o desempenho).

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

752
driis

.First lançará uma exceção quando não houver resultados. .FirstOrDefault não, ele 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, FirstOrDefault é preferível 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.

256
Jeroen Landheer

.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, .First() está bem. Se você preferir verificar o valor de retorno para! = Null de 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.

102
marc_s

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 um exemplo ...

UserInfo Table

Como usar o primeiro ()

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

Há apenas um registro em que ID == 1. Deve retornar este registro
ID: 1 Nome: Manish Sobrenome: Dubey Email: [email protected]

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: [email protected]

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

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

Como usar FirstOrDefault ()

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

Há apenas um registro em que ID == 1. Deve retornar este registro
ID: 1 Nome: Manish Sobrenome: Dubey Email: [email protected]

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: [email protected]

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

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

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

60
Mukesh Kumar

Em primeiro lugar, Take é um método completamente diferente. Ele retorna um IEnumerable<T> e não um 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.

A propósito, se sua sequência contém elementos default(T) (por exemplo, null) e você precisa distinguir entre empty e o primeiro elemento null, não é possível usar FirstOrDefault.

18
Mehrdad Afshari

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/

13
user2051770

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

A mensagem de exceção também não incluirá expressões 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 entrada 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));
}
7
Kye

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, 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.

4
Nimesh khatri

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 o LINQ, então peço desculpas se isso está fora de questão.

3
NULL
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 de falha de exceção/programa.

Por exemplo, se a lógica de negócios diz que não podemos ter zero transações 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.

2
Manish Basantani

Este tipo de função 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 seqüência com base em uma determinada condição. Aqui está um exemplo.

  List<int> items = new List<int>() { 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 ();

2
Sheo Dayal Singh

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<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));
1
Arian