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

Resuelto Metro Smurf asked hace 15 años • 14 respuestas

He buscado y realmente no he encontrado una respuesta clara sobre cuándo querrías usar .Firsty cuándo querrías usar .FirstOrDefaultcon LINQ.

  • ¿Cuándo querrías usarlo .First? ¿Solo cuando desea detectar la excepción si no se devuelven resultados?

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

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • Y de hecho, ¿qué pasa con Take?

    var result = List.Where(x => x == "foo").Take(1);
    
Metro Smurf avatar Jun 22 '09 02:06 Metro Smurf
Aceptado

Lo usaría First()cuando sé o espero que la secuencia tenga al menos un elemento. Es decir, cuando es excepcional que la secuencia esté vacía.

Úselo FirstOrDefault()cuando sepa que necesitará verificar si había un elemento o no. En otras palabras, cuando es legal que la secuencia esté vacía. No debe confiar en el manejo de excepciones para la verificación. (Es una mala práctica y podría perjudicar el rendimiento).

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

driis avatar Jun 21 '2009 19:06 driis

.Firstlanzará una excepción cuando no haya resultados. .FirstOrDefaultno lo hará, simplemente devolverá nulo (tipos de referencia) o el valor predeterminado del tipo de valor. (por ejemplo, como 0para un int.) La pregunta aquí no es cuándo desea el tipo predeterminado, sino más bien: ¿está dispuesto a manejar una excepción o manejar un valor predeterminado? Dado que las excepciones deben ser excepcionales, FirstOrDefaultse prefiere cuando no está seguro de obtener resultados de su consulta. Cuando lógicamente los datos deberían estar ahí, se puede considerar el manejo de excepciones.

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

Jeroen Landheer avatar Jun 21 '2009 19:06 Jeroen Landheer

.First()lanzará una excepción si no hay ninguna fila que devolver, mientras que en su lugar .FirstOrDefault()devolverá el valor predeterminado ( NULLpara todos los tipos de referencia).

Entonces, si está preparado y dispuesto a manejar una posible excepción, .First()está bien. Si prefiere verificar el valor de retorno de != nulltodos modos, entonces .FirstOrDefault()es su mejor opción.

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

marc_s avatar Jun 21 '2009 19:06 marc_s

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. debe usarlo si se espera más de un elemento y solo desea el primer elemento.

Primero o predeterminado()

  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. debe usarlo si se espera más de un elemento y solo desea 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 la siguiente tabla, he creado un ejemplo...

Tabla de información de usuario

Cómo utilizar Primero()

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

Solo hay un registro donde ID== 1. Debería devolver este
ID de registro: 1 Nombre: Manish Apellido: Dubey Correo electrónico: [email protected]

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

Hay varios registros donde FName == "Rahul". Se debe devolver el primer registro.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: [email protected]

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

No hay ningún registro con ID== 13. Debería ocurrir un error.
InvalidOperationException: la secuencia no contiene elementos

Cómo utilizar FirstOrDefault()

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

Solo hay un registro donde ID== 1. Debería devolver este
ID de registro: 1 Nombre: Manish Apellido: Dubey Correo electrónico: [email protected]

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

Hay varios registros donde FName == "Rahul". Se debe devolver el primer registro.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: [email protected]

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

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

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

Mukesh Kumar avatar Sep 02 '2014 05:09 Mukesh Kumar