2011-02-27 11 views
5

Tengo un formulario de búsqueda con un campo de nombre de usuario opcional. Si no se proporciona el nombre de usuario, se deben devolver todas las coincidencias.Linq con cláusulas WHERE opcionales y Sql Server CE

Estoy utilizando Linq y Sql Server CE 4.0.

El código LINQ tiene el siguiente -.>

from p in context.Accounts 
where (name==string.Empty || p.UserName.Contains(name)) 

con SQL Server CE esto arroja el siguiente error

"Un parámetro no está permitido en esta ubicación Asegúrese de que el símbolo '@' está en una ubicación válida o que los parámetros son válidos en esta declaración SQL ".

¿Hay algún otro enfoque que pueda tomar para tener cláusulas Where en Linq?

FYI la siguiente

from p in context.Accounts 
where (string.IsNullOrEmpty(name) || p.UserName.Contains(name)) 

me da el error

"El valor del argumento especificado para la función no es válida. [Argumento # = 1, nombre de la función (si se conoce) = isnull] "}

Esto se debe a que el servidor SQL Sql no admite IsNull. Simplemente hago lo siguiente si el parámetro Name es nulo.

if (name == null) 
    name = string.Empty; 

Respuesta

9

Prueba esto:

var query = from p in context.Accounts 
      select p; 

if (!string.IsNullOrEmpty(name)) { 
    query = query.Where(p => p.UserName.Contains(name)); 
} 

No hay ninguna regla que dice la consulta tiene que ser en una sola sentencia. Puede agregar una consulta existente hasta el momento en que la ejecute.

+0

¿Se compilará esto a una sentencia SQL cuando se ejecute? ¿O extraerá todas las cuentas, luego filtrará, etc. Digamos que tengo 10,000 cuentas, todas serán extraídas a la memoria y luego filtradas? – Kenoyer130

+0

@ Kenoyer130, compilará en una declaración sql. –

+2

@ Kenoyer130 debería leer un poco acerca de la ejecución retrasada de LINQ o tendrá sorpresas y errores que no comprenderá;) – Guillaume86

Cuestiones relacionadas