He buscado y realmente no he encontrado una respuesta clara sobre cuándo querría usar .First
y cuándo querría usar .FirstOrDefault
con LINQ.
¿Cuándo te gustaría usar
.First
? ¿Solo cuando desee capturar la excepción si no se devuelven resultados?var result = List.Where(x => x == "foo").First();
¿Y cuándo te gustaría usar
.FirstOrDefault
? ¿Cuándo siempre quieres el tipo predeterminado si no hay resultado?var result = List.Where(x => x == "foo").FirstOrDefault();
Y para el caso, ¿qué pasa con Take?
var result = List.Where(x => x == "foo").Take(1);
.First
y.FirstOrDefault
ambos toman predicados como argumentos, por lo quevar result = List.Where(x => x == "foo").First();
podrían reescribirse comovar result = List.First(x => x == "foo");
Single
ySingleOrDefault
. Odio cuando las personas usanFirst
cuando realmente quieren decirSingle
; ).FirstOrDefault()
siempre le brinda la oportunidad de lanzar una excepción más significativa. Si se produce una excepción de secuencia y más de una.First()
en un método, puede ser difícil discernir qué enunciado es el problema.Respuestas:
yo usaría
First()
cuando conozco o espero que la secuencia tenga al menos un elemento. En otras palabras, cuando es una ocurrencia excepcional que la secuencia está vacía.Úselo
FirstOrDefault()
cuando sepa que tendrá que 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 puede afectar el rendimiento).Finalmente, la diferencia entre
First()
yTake(1)
es queFirst()
devuelve el elemento en sí, mientras queTake(1)
devuelve una secuencia de elementos que contiene exactamente un elemento.fuente
.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 cuándo desea el tipo predeterminado, sino más: ¿Está dispuesto a manejar una excepción o manejar un valor predeterminado? Dado que las excepciones deben ser excepcionales,FirstOrDefault
se prefiere cuando no está seguro de 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()
yTake()
se usan normalmente al configurar la paginación en los resultados. (Como mostrar los primeros 10 resultados, y los siguientes 10 en la página siguiente, etc.)Espero que esto ayude.
fuente
.FirstOrDefault
devolverá nulo para los tipos de referencia. Estaba confundido acerca de lo que sería un objeto "predeterminado". Esta respuesta aclaró eso..First()
lanzará una excepción si no se devuelve ninguna fila, mientras.FirstOrDefault()
que en su lugar devolverá el valor predeterminado (NULL
para todos los tipos de referencia).Entonces, si está preparado y dispuesto a manejar una posible excepción,
.First()
está bien. Si prefiere comprobar el valor de retorno de!= null
todos modos, entonces.FirstOrDefault()
es su mejor opción.Pero supongo que también es una preferencia personal. Use el que tenga más sentido para usted y se adapte mejor a su estilo de codificación.
fuente
Primero()
FirstOrDefault ()
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 ...
Cómo usar First ()
Solo hay un registro donde ID == 1. Debe devolver este
ID de registro : 1 Nombre: Apellido masculino: Correo electrónico de Dubey: [email protected]
Hay varios registros donde FName == "Rahul". El primer registro debe ser devuelto.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: [email protected]
No hay registro con ID == 13. Debe producirse un error.
InvalidOperationException: la secuencia no contiene elementos
Cómo usar FirstOrDefault ()
Solo hay un registro donde ID == 1. Debe devolver este
ID de registro : 1 Nombre: Apellido masculino: Correo electrónico de Dubey: [email protected]
Hay varios registros donde FName == "Rahul". El primer registro debe ser devuelto.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: [email protected]
No hay registro con ID == 13. El valor de retorno es nulo
Espero que te ayude a entender cuándo usar
First()
oFirstOrDefault()
.fuente
En primer lugar,
Take
es un método completamente diferente. Devuelve unIEnumerable<T>
y no uno soloT
, así que eso está fuera.Entre
First
yFirstOrDefault
, debes usarFirst
cuando esté seguro de que existe un elemento y si no existe, entonces hay un error.Por cierto, si su secuencia contiene
default(T)
elementos (pnull
. Ej. ) Y necesita distinguir entre estar vacío y ser el primer elementonull
, no puede usarloFirstOrDefault
.fuente
Primero:
FirstOrDefault:
De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
fuente
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 identificar qué
.First()
enunciado en particular en un método arrojó la excepción puede ser difícil.El mensaje de excepción tampoco incluirá ninguna expresión Lambda que pueda haber utilizado, lo que haría que cualquier problema sea aún más difícil de depurar.
Es por eso que siempre uso
FirstOrDefault()
aunque sé que una entrada nula constituiría una situación excepcional.fuente
Primero()
Cuando sepa que el resultado contiene más de 1 elemento esperado y solo debería el primer elemento de secuencia.
FirstOrDefault ()
FirstOrDefault () es igual que First () excepto que, si ningún elemento coincide con la condición especificada, devuelve el valor predeterminado del tipo subyacente de colección genérica. No arroja InvalidOperationException si no se encuentra ningún elemento. Pero la colección de elementos o una secuencia es nula de lo que arroja una excepción.
fuente
Este tipo de función pertenece a operadores de elementos. Algunos operadores de elementos útiles se definen a continuación.
Usamos operadores de elementos cuando necesitamos seleccionar un solo elemento de una secuencia basada en una determinada condición. Aquí hay un ejemplo.
El operador First () devuelve el primer elemento de una secuencia después de cumplir la condición. Si no se encuentra ningún elemento, arrojará una excepción.
int result = items.Where (item => item == 2) .Primero ();
El operador FirstOrDefault () devuelve el primer elemento de una secuencia después de cumplir la condición. Si no se encuentra ningún elemento, devolverá el valor predeterminado de ese tipo.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
fuente
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á una excepción "La secuencia no contiene elementos".
Descargo de responsabilidad: nunca he usado LINQ, así que disculpe si esto está fuera de lugar.
fuente
¿Cuál usar? Debe decidirse por la lógica del negocio, y no por el miedo a la excepción / falla del programa.
Por ejemplo, si la lógica de negocios dice que no podemos tener cero transacciones en ningún día hábil (solo asuma). Entonces no deberías tratar de manejar este escenario con alguna programación inteligente. Siempre usaré First () sobre dicha colección, y dejaré que el programa falle si algo más arruinó la lógica de negocios.
Código:
Me gustaría ver otros comentarios sobre esto.
fuente
Ok déjame dar mis dos centavos. First / Firstordefault son para cuando usa el segundo constructor. No explicaré lo que es, pero es cuando potencialmente siempre usarías uno porque no quieres causar una excepción.
fuente
Otros han descrito muy bien la diferencia entre
First()
yFirstOrDefault()
. Quiero dar un paso más en la interpretación de la semántica de estos métodos. En mi opiniónFirstOrDefault
se está usando demasiado. En la mayoría de los casos, cuando está filtrando datos, esperaría recuperar una colección de elementos que coinciden con la condición lógica o un único elemento único por su identificador único, como un usuario, libro, publicación, etc. por qué incluso podemos llegar a decir queFirstOrDefault()
es un olor a código, no porque haya algo mal, sino porque se está usando con demasiada frecuencia. Esta publicación de blog explora el tema en detalle. OMI la mayoría de las vecesSingleOrDefault()
es una alternativa mucho mejor, así que tenga cuidado con este error y asegúrese de utilizar el método más apropiado que represente claramente su contrato y sus expectativas.fuente
Hay muchas formas de implementar consultas simples y simples en colecciones, solo escribimos uniones en sql, un filtro se puede aplicar primero o último dependiendo de la necesidad y la necesidad.
Aquí hay un ejemplo donde podemos encontrar un elemento con una identificación en una colección. Para agregar más sobre esto, los métodos Primero,
FirstOrDefault
idealmente devolverían lo mismo cuando una colección tiene al menos un registro. Sin embargo, si una colección está bien estar vacía. luegoFirst
devolverá una excepción peroFirstOrDefault
volveránull
o será predeterminada. Por ejemplo,int
devolverá 0. Por lo tanto, el uso de tales se dice que es una preferencia personal, pero es mejor usarloFirstOrDefault
para evitar el manejo de excepciones.fuente