Entity Framework 4 Single () vs First () versus FirstOrDefault ()

Me está costando mucho encontrar una comparación de las diferentes formas de consultar un solo elemento y cuándo usar cada uno.

¿Alguien tiene un enlace que compare todo esto, o una explicación rápida de por qué usaría uno sobre el otro? ¿Todavía hay más operadores que desconozco?

Gracias.

Aquí hay una descripción general de los diferentes métodos:

  • Buscar (): cuando desea obtener un artículo por clave principal. Esto devolverá nulo si no puede encontrar un artículo. Se verá en el contexto antes de ir a la base de datos (como lo señala Yaron en los comentarios) que puede ser un factor de eficiencia importante si necesita obtener la misma entidad varias veces mientras el mismo contexto está activo.

  • Single (): cuando espera que una consulta devuelva exactamente un elemento. Esto generará una excepción si la consulta no devuelve exactamente un elemento.

  • SingleOrDefault (): cuando espera que una consulta devuelva cero o un elemento (es decir, no está seguro de si existe un elemento con una clave determinada). Esto lanzará una excepción si la consulta no devuelve cero o un elemento.

  • Primero (): cuando espera que uno o más elementos sean devueltos por una consulta, pero solo desea acceder al primer elemento de su código (el orden puede ser importante en la consulta aquí). Esto generará una excepción si la consulta no devuelve al menos un elemento.

  • FirstOrDefault (): cuando espera que una consulta devuelva cero o más elementos, pero solo desea acceder al primer elemento de su código (es decir, no está seguro de si existe un elemento con una clave determinada)

Siempre tiendo a usar FirstOrDefault. Si realmente quieres ser exigente con el rendimiento, entonces debes usar FirstOrDefault en EF. Bajo las cubiertas, SingleOrDefault usa la parte superior (2) en la consulta porque necesita verificar si hay una segunda fila que coincida con los criterios y, si lo hace, arroja una excepción. Básicamente en SingleOrDefault está diciendo que desea lanzar una excepción si su consulta devuelve más de 1 registro.

Es realmente muy simple: Single devuelve un solo elemento y lanza una excepción si no hay ninguno o hay más de un elemento. First devolverá el primer artículo o lanzará cuando no haya ningún artículo. FirstOrDefault devolverá el primer elemento o devolverá el valor predeterminado (que es null en caso de que el tipo proporcionado sea un tipo de referencia) cuando no haya ningún elemento.

Este es el comportamiento que se supone que tiene la API. Sin embargo, tenga en cuenta que la implementación subyacente podría tener un comportamiento diferente. Mientras que Entity Framework obedece esto, un O / RM como LLBLGen también puede devolver null cuando se llama a First cual es algo muy extraño. Esta fue una decisión muy extraña (y obstinada) por el diseñador IMO.

Los cuatro métodos tienen su lugar; Aunque realmente solo tienes dos operaciones diferentes.

  • Primero: esperando un conjunto de resultados que contenga varios elementos, dame el primer elemento de ese conjunto.
  • Individual: esperando un único resultado, dame ese artículo.

La versión xxxxOrDefault () solo agrega “No quiero considerar un conjunto de resultados vacío como una circunstancia excepcional”.

Por otro lado, puede dividir estos métodos por la lógica central, así:

  • El método consultará la base de datos directamente : Single (), SingleOrDefault (), First (), FirstOrDefault ()
  • El método realizará una búsqueda en caché incluso antes de emitir la consulta en la base de datos : Find ()

Para obtener información sobre el rendimiento, especialmente en el segundo caso, puede consultar aquí: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3.

Además, en el primer grupo puede definir consultas complejas, pero con el método Find () puede proporcionar solo la clave de entidad para la búsqueda.

Single () y SingleOrDefault () se usan generalmente en identificadores únicos como ID, mientras que First () o FirstOrDefault () se usan generalmente para una consulta que podría tener resultados múltiples pero solo desea el “Top 1” .

Single () o First () generarían una excepción si no se devuelve ningún resultado, SingleOrDefault () y FirstOrDefault () capturan la excepción y devuelven nulo o predeterminado (ResultDataType).