"tendrá que seleccionar en primer lugar todas las filas de base de datos y luego encontrar el"
Técnicamente, no, la combinación de .Elija seguido por .SingleOrDefault no va a hacer eso. Select() configura los parámetros para la consulta, pero en realidad no capta ningún dato. La ejecución diferida de LINQ no capta ninguna fila hasta que algo realmente tiene que producir un resultado de datos. Puede redactar varias consultas juntas (.Seleccione (...). Seleccione (..) etc.) y nada realmente capta ninguna fila hasta que realice una operación que devuelva datos, como First() o .ToList().
Sin embargo, el uso de Single() puede hacer que se escanee todo el conjunto de datos para probar que la única fila coincidente es la única fila coincidente.
Piénselo: ¿cómo sabrá la consulta que la fila única es la fila en el conjunto de datos que coincide? Tendrá que tratar de encontrar la siguiente fila. Si realmente hay una sola fila que coincide con millones en el conjunto de datos, Single() puede tener que recorrer todos esos millones de filas para demostrar que la coincidencia actual es la única coincidencia.
Si su conjunto de datos es SQL, y sus datos están indexados de manera que permiten la optimización de consultas, entonces Single() podría no ser tan malo. Pero si sus datos SQL no están indexados de una manera que sea útil para esta consulta, Single() puede crear mucho trabajo para el servidor SQL.
Single() es apropiado si la lógica de su programa realmente necesita saber que la fila devuelta es la única fila en todo el conjunto de datos. Sin embargo, hay otras formas de garantizar la singularidad. Si puede configurar una clave principal en sus datos que coincida con su condición LINQ, entonces solo una fila correspondiente puede existir/agregarse a la base de datos para comenzar, por lo que realmente no necesita Single(). (Y, irónicamente, el rendimiento de Single() también será trivialmente rápido en este caso porque el índice de clave principal se puede usar para optimizar la consulta)
Si solo desea la primera fila que coincida con la condición, use Primero () en lugar de Individual(). Primero() solo tiene que escanear filas de datos hasta que encuentre la primera coincidencia. No tiene que continuar escaneando filas para probar que la primera coincidencia es la única coincidencia, como Single().
Gracias. He estado usando firstordefault pero al hacer la pregunta de alguna manera lo olvidé. –
Iba a sugerir FirstOrDefault() también. –