Aquí hay una descripción general de los diferentes métodos:
Find (): cuando desee obtener un elemento por clave principal. Esto devolverá nulo si no puede encontrar un artículo. Verá en el contexto antes de ir a la base de datos (como lo señaló Yaron en los comentarios), lo que puede ser un factor de eficiencia importante si necesita obtener la misma entidad varias veces mientras el mismo contexto está vivo.
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 generará una excepción si la consulta no devuelve cero o un elemento.
Primero (): cuando espera que una consulta devuelva uno o más elementos, pero solo desea acceder al primer elemento de su código (el pedido podría 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)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
oSingleOrDefault
consultará 2 registros (límite 2) mientras queFirst
oFirstOrDefault
consultará 1 (límite 1).Yo siempre suelo usar
FirstOrDefault
. Si realmente quieres ser exigente con el rendimiento, debes usarFirstOrDefault
EF. Debajo de las cubiertasSingleOrDefault
usa top (2) en la consulta porque necesita verificar si hay una segunda fila que coincide con los criterios y, si lo hace, lanza una excepción. BásicamenteSingleOrDefault
, está diciendo que desea lanzar una excepción si su consulta devuelve más de 1 registro.fuente
FirstOrDefault
ySingleOrDefault
sea significativa? Yo diría que es una optimización prematura en la mayoría de los casos.Single()
oSingleOrDefault()
cuando devuelvo algo de lo cual solo debería existir uno . La razón por la que lo hago es para detectar errores al realizar consultas mal escritas, que devuelven más de lo que deberían, fallan. Al menos en mi opinión, esto ayudará a mantener la coherencia de los datos en el sistema. Por supuesto, esto es más lento, pero supongo que no es mucho más lento y estoy dispuesto a pagar ese precio.Es realmente muy simple:
Single
devuelve un solo elemento y lanza una excepción si no hay ninguno o más de un elemento.First
devolverá el primer artículo o lo arrojará cuando no haya ningún artículo.FirstOrDefault
devolverá el primer artículo o devolverá el valor predeterminado (que esnull
en caso de que el tipo dado sea un tipo de referencia) cuando no haya ningún artículo.Este es el comportamiento que se supone que debe tener la API. Sin embargo, tenga en cuenta que la implementación subyacente podría tener un comportamiento diferente. Si bien Entity Framework obedece a esto, un O / RM como LLBLGen también puede regresar
null
al llamar, loFirst
cual es algo muy extraño. Esta fue una decisión muy extraña (y obstinada) del diseñador IMO.fuente
Single
expresa claramente que solo espera que el resultado tenga un elemento.Cada uno de los cuatro métodos tiene su lugar; Aunque en realidad solo tienes dos operaciones diferentes.
La versión xxxxOrDefault () simplemente agrega "No quiero considerar un conjunto de resultados vacío como una circunstancia excepcional".
fuente
Por otro lado, puede dividir estos métodos por la lógica central, así:
Para obtener algunos detalles de 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.
fuente
Single () y SingleOrDefault () generalmente se usan en identificadores únicos como ID, mientras que First () o FirstOrDefault () generalmente se usan para una consulta que podría tener varios resultados pero que solo desea el "Top 1" .
Single () o First () arrojarían una excepción si no se devuelve ningún resultado, SingleOrDefault () y FirstOrDefault () detectan la excepción y devuelven un valor nulo o predeterminado (ResultDataType).
fuente