2008-10-15 8 views
40

Si consultar una tabla con una condición en el campo de clave como en:mejor camino para recuperar los resultados solo registro en LINQ a SQL

 var user = from u in dc.Users 
        where u.UserName == usn 
        select u; 

sé que voy a obtener ya sea cero o un resultado resultados. ¿Debo seguir adelante y recuperar los resultados usando un for-each o hay otra forma preferida de manejar este tipo de situación?

+0

Gracias por la sugerencia de FirstOrDefault o SingleOrDefault. Hay mucho en LINQ que aún no he usado, y puedo decir que hay mucho más por ahí. –

Respuesta

76

intentar algo como esto:

var user = (from u in dc.Users 
        where u.UserName == usn 
        select u).FirstOrDefault(); 

FirstOrDefault El método devuelve el primer elemento de una secuencia que satisface una condición especificada o un valor por defecto si no se encuentra dicho elemento.

+1

no funcionará para linq a sql –

17

Por qué no algo así como

var user = dc.Users.SingleOrDefault(u=> u.UserName==usn); 
+7

FirstOrDefault realizará una operación TOP 1 para mayor eficiencia. Lamentablemente, SingleOrDefault no hace un TOP 2 y selecciona todo el conjunto. – DamienG

+0

No estoy seguro si eso es siempre cierto, quizás dependiendo de la versión o la sintaxis exacta. Tiendo a ver sentencias sql como estas cuando uso SingleOrDefault: "SELECT TOP (2) col1, col2 FROM (SELECCIONE col1, col2) AS Extensión1 DONDE ..." Por lo tanto, es algo superior a 2 y no lo es. ;-) – Culme

1

que utilizaría el método SingleOrDefault.

var user = (from u in dc.Users 
        where u.UserName == usn 
        select u).SingleOrDefault(); 
4

Usaría First() o FirstOrDefault().

La diferencia: en Primero() habrá una excepción lanzada si no se puede encontrar ninguna fila.

5

También se debe tener en cuenta que First/FirstOrDefault/Single/SingleOrDefault es el punto de ejecución de un comando LINQ a Sql. Dado que la instrucción LINQ no se ha ejecutado antes de eso, puede afectar el SQL generado (por ejemplo, puede agregar un TOP 1 al comando sql)

+0

Solo la información que estaba buscando. Gracias – Sal

0

Otra opción es usar Contiene (nombre de usuario) en lugar de " == "

var user = (from u in dc.UserInfo 
         where u.Users.Contains(username) 
         select u).SingleOrDefault(); 
Cuestiones relacionadas