Pregunta ¿Cuándo usar. Primero y cuándo usar .FirstOrDefault con LINQ?


He buscado y no he encontrado una respuesta clara sobre cuándo querrías usar .First y cuando quieras usar .FirstOrDefault con LINQ.

  • Cuándo querrías usar .First? ¿Solo cuando quisieras atrapar la excepción si no se devolvieran los resultados?

    var result = List.Where(x => x == "foo").First();
    
  • Y cuando querrías usar .FirstOrDefault? ¿Cuándo siempre querría el tipo predeterminado si no hay resultados?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • Y para el caso, ¿qué hay de Take?

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

673
2018-06-21 19:15


origen


Respuestas:


yo usaría First() cuando sé o espero que la secuencia tenga al menos un elemento. En otras palabras, cuando es una ocurrencia excepcional, la secuencia está vacía.

Utilizar FirstOrDefault() cuando sepa que deberá verificar si hubo algún elemento o no. En otras palabras, cuando es legal que la secuencia esté vacía. No debe confiar en el manejo de excepciones para el cheque. (Es una mala práctica y puede perjudicar el rendimiento).

Finalmente, la diferencia entre First() y Take() es eso First() devuelve el elemento en sí, mientras Take() devuelve una secuencia de elementos que contiene exactamente un elemento. (Si pasa 1 como el parámetro).


681
2018-06-21 19:22



.First lanzará una excepción cuando no haya resultados. .FirstOrDefault no lo hará, simplemente devolverá nulo (tipos de referencia) o el valor predeterminado del tipo de valor. (por ejemplo, 0 para un int.) La pregunta aquí no es cuando quiere el tipo predeterminado, sino más: ¿Está dispuesto a manejar una excepción o manejar un valor predeterminado? Como las excepciones deben ser excepcionales, FirstOrDefault es preferible cuando no está seguro si va a obtener resultados de su consulta. Cuando lógicamente los datos deberían estar allí, se puede considerar el manejo de excepciones.

Skip() y Take() se utilizan normalmente al configurar la paginación en los resultados. (Como mostrar los primeros 10 resultados, y los 10 siguientes en la página siguiente, etc.)

Espero que esto ayude.


224
2018-06-21 19:23



.First () lanzará una excepción si no se devuelve ninguna fila, mientras que .FirstOrDefault () devolverá el valor predeterminado (NULL para todos los tipos de referencia).

Entonces, si estás preparado y dispuesto a manejar una posible excepción, .First() está bien. Si prefiere verificar el valor de retorno para! = Null de todos modos, entonces .FirstOrDefault() es tu mejor elección.

Pero supongo que también es una preferencia personal. Use el que tenga más sentido para usted y se ajuste mejor a su estilo de codificación.


90
2018-06-21 19:22



Primero() 

  1. Devuelve el primer elemento de una secuencia.
  2. Lanza un error cuando no hay ningún elemento en el resultado o la fuente es nula.
  3. deberías usarlo, si se espera más de un elemento y solo deseas el primer elemento.

FirstOrDefault () 

  1. Devuelve el primer elemento de una secuencia, o un valor predeterminado si no se encuentra ningún elemento.
  2. Lanza un error Solo si la fuente es nula.
  3. deberías usarlo, si se espera más de un elemento y solo deseas el primer elemento. También es bueno si el resultado está vacío.

Tenemos una tabla UserInfos, que tiene algunos registros como se muestra a continuación. Sobre la base de esta tabla a continuación, he creado un ejemplo ...

UserInfo Table

Cómo usar First ()

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

Solo hay un registro donde ID == 1. Debería devolver este registro
ID: 1 Nombre: Manish Apellido: Dubey Correo electrónico: xyz@xyz.com

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

Hay varios registros donde FName == "Rahul". El primer registro debe ser devuelto.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: xyz1@xyz.com

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

No hay registro con ID == 13. Se debe producir un error.
InvalidOperationException: la secuencia no contiene elementos

Cómo usar FirstOrDefault ()

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

Solo hay un registro donde ID == 1. Debería devolver este registro
ID: 1 Nombre: Manish Apellido: Dubey Correo electrónico: xyz@xyz.com

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

Hay varios registros donde FName == "Rahul". El primer registro debe ser devuelto.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: xyz1@xyz.com

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

No hay registro con ID == 13. El valor de retorno es nulo

Espero que te ayude a entender cuándo usar First() o FirstOrDefault().


54
2017-09-02 05:35



Ante todo, Take es un método completamente diferente. Devuelve un IEnumerable<T> y ni un solo T, así que está fuera.

Entre First y FirstOrDefault, Deberías usar First cuando está seguro de que existe un elemento y, de lo contrario, hay un error.

Por cierto, si tu secuencia contiene default(T) elementos (p. null) y necesita distinguir entre estar vacío y ser el primer elemento nullno puedes usar FirstOrDefault.


17
2018-06-21 19:23



Primero:

  • Devuelve el primer elemento de una secuencia
  • Lanza excepción: no hay elementos en el resultado
  • Usar cuando: cuando se espera más de 1 elemento y solo desea el primer elemento

FirstOrDefault:

  • Devuelve el primer elemento de una secuencia, o un valor predeterminado si no se encuentra ningún elemento
  • Emite excepción: solo si la fuente es nula
  • Usar cuando: cuando se espera más de 1 elemento y solo desea el primero. También está bien que el resultado esté vacío

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


13
2018-04-04 14:29



Otra diferencia a tener en cuenta es que si está depurando una aplicación en un entorno de producción, es posible que no tenga acceso a los números de línea, por lo que se identifica qué .First() declaración en un método lanzó la excepción puede ser difícil.

El mensaje de excepción tampoco incluirá ninguna expresión Lambda que haya utilizado, lo que dificultaría la depuración de cualquier problema.

Es por eso que siempre uso FirstOrDefault() aunque sé que una entrada nula constituiría una situación excepcional.

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

6
2017-09-17 00:50



Encontré un sitio web que parece explicar la necesidad de FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Si no hay resultados para una consulta, y desea llamar a First () o Single () para obtener una sola fila ... Obtendrá la excepción "La secuencia no contiene ningún elemento".

Descargo de responsabilidad: nunca he usado LINQ, así que mis disculpas si esto está fuera de contexto.


3
2018-06-21 19:24