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

He buscado y realmente no he encontrado una respuesta clara sobre cuándo quieres usar. .First y cuándo quieres 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 cuándo quieres 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); 

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.

Use FirstOrDefault() cuando sepa que necesitará verificar si hubo 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 el cheque. (Es una mala práctica y puede perjudicar el rendimiento).

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

.First arrojará una excepción cuando no haya resultados. .FirstOrDefault no lo hará, simplemente devolverá null (tipos de referencia) o el valor predeterminado del tipo de valor. (por ejemplo, como 0 para un int.) La pregunta aquí no es cuando desea el tipo predeterminado, pero más: ¿Está dispuesto a manejar una excepción o manejar un valor predeterminado? Dado que las excepciones deben ser excepcionales, se prefiere FirstOrDefault 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() y Take() se utilizan normalmente al configurar la búsqueda en los resultados. (Como mostrar los primeros 10 resultados, y los 10 siguientes en la página siguiente, etc.)

Espero que esto ayude.

.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á preparado y dispuesto a manejar una posible excepción, .First() está bien. Si prefiere verificar el valor de retorno para! = .FirstOrDefault() 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 ajuste mejor a su estilo de encoding.

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 …

Tabla de UserInfo

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() .

En primer lugar, Take es un método completamente diferente. Devuelve un IEnumerable y ni una sola T , así que está fuera.

Entre First y FirstOrDefault , debe usar First cuando esté seguro de que existe un elemento y si no existe, entonces hay un error.

Por cierto, si su secuencia contiene elementos default(T) (por ejemplo, null ) y necesita distinguir entre estar vacío y el primer elemento null , no puede usar FirstOrDefault .

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/

Otra diferencia a tener en cuenta es que si depura 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 la statement .First() 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 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)); } 

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.

Primero()

Cuando sabe que el resultado contiene más de 1 elemento esperado, debe incluir solo el primer elemento de la secuencia.

FirstOrDefault ()

FirstOrDefault () es como 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 elemento o una secuencia es nula de lo que arroja una excepción.

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

¿Cuál usar? Debería decidirse por la lógica comercial, y no por el temor a la falla de la excepción / progtwig.

Por ejemplo, si la lógica empresarial dice que no podemos tener cero transacciones en cualquier día laboral (solo asum). Entonces no deberías tratar de manejar este escenario con alguna progtwigción inteligente. Siempre usaré First () sobre dicha colección, y dejaré que el progtwig falle si algo más arruina la lógica de negocios.

Código:

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

Me gustaría ver otros comentarios sobre esto.

Ok, déjame dar mis dos centavos. First / Firstordefault son para cuando usa el segundo constructor. No voy a explicar de qué se trata, pero es cuando posiblemente siempre usarías uno porque no quieres causar una excepción.

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

Este tipo de función pertenece a los operadores de elementos. Algunos operadores de elementos útiles se definen a continuación.

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

Usamos operadores de elementos cuando necesitamos seleccionar un solo elemento de una secuencia basada en una determinada condición. Aquí hay un ejemplo.

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

El primer operador () 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) .First ();

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 ();

linq muchas formas de implementar una consulta simple en las colecciones, solo escribimos uniones en sql, un filtro se puede aplicar primero o último dependiendo de la necesidad y 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 First, FirstOrDefault , idealmente devolverían el mismo cuando una colección tiene al menos un registro. Sin embargo, si una colección está bien, está vacía. luego First devolverá una excepción pero FirstOrDefault devolverá null o predeterminado. Por ejemplo, int devolverá 0. Por lo tanto, el uso de tal es, aunque se dice, preferencia personal, pero es mejor usar FirstOrDefault para evitar el manejo de excepciones. aquí hay un ejemplo en el que corremos una colección de listas de transacciones