Estamos trabajando en un visor de registros. El uso tendrá la opción de filtrar por usuario, gravedad, etc. En los días de Sql agregaría a la cadena de consulta, pero quiero hacerlo con Linq. ¿Cómo puedo agregar condicionalmente cláusulas where?
c#
linq
linq-to-sql
.net-3.5
sgwill
fuente
fuente
LINQ to Entities does not recognize the method 'System.String get_Item(System.String)' method, and this method cannot be translated into a store expression.
Si necesita filtrar la base en una lista / matriz, use lo siguiente:
fuente
Terminé usando una respuesta similar a la de Daren, pero con una interfaz IQueryable:
Eso construye la consulta antes de llegar a la base de datos. El comando no se ejecutará hasta .ToList () al final.
fuente
Cuando se trata de linq condicional, me gustan mucho los filtros y el patrón de tuberías.
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/
Básicamente, crea un método de extensión para cada caso de filtro que incluye IQueryable y un parámetro.
fuente
Resolví esto con un método de extensión para permitir que LINQ se habilite condicionalmente en medio de una expresión fluida. Esto elimina la necesidad de dividir la expresión con
if
declaraciones..If()
método de extensión:Esto le permite hacer esto:
Aquí también hay una
IEnumerable<T>
versión que manejará la mayoría de las otras expresiones LINQ:fuente
Otra opción sería utilizar algo como el PredicateBuilder que se analiza aquí . Te permite escribir código como el siguiente:
Tenga en cuenta que solo tengo esto para trabajar con Linq 2 SQL. EntityFramework no implementa Expression.Invoke, que es necesario para que este método funcione. Tengo una pregunta sobre este tema aquí .
fuente
Haciendo esto:
teniendo esto en la
where
declaración:significa que cuando se crea la consulta final, si
lastNameSearch
es así,false
la consulta omitirá completamente cualquier SQL para la búsqueda de apellido.fuente
No es lo más bonito, pero puede usar una expresión lambda y pasar sus condiciones opcionalmente. En TSQL, hago muchas de las siguientes acciones para que los parámetros sean opcionales:
Puede duplicar el mismo estilo con la siguiente lambda (un ejemplo de verificación de autenticación):
fuente
Recientemente tuve un requisito similar y finalmente encontré esto en MSDN. Ejemplos de CSharp para Visual Studio 2008
Las clases incluidas en la muestra DynamicQuery de la descarga le permiten crear consultas dinámicas en tiempo de ejecución en el siguiente formato:
Con esto, puede crear una cadena de consulta dinámicamente en tiempo de ejecución y pasarla al método Where ():
fuente
Puede crear y utilizar este método de extensión
fuente
Simplemente use el operador && de C #:
Editar: Ah, necesito leer más detenidamente. Quería saber cómo agregar condicionalmente cláusulas adicionales. En ese caso, no tengo ni idea. :) Lo que probablemente haría es preparar varias consultas y ejecutar la correcta, dependiendo de lo que termine necesitando.
fuente
Podrías usar un método externo:
Esto funcionaría, pero no se puede dividir en árboles de expresión, lo que significa que Linq to SQL ejecutaría el código de verificación en cada registro.
Alternativamente:
Eso podría funcionar en árboles de expresión, lo que significa que Linq to SQL estaría optimizado.
fuente
Bueno, lo que pensé fue que podrías poner las condiciones del filtro en una lista genérica de Predicados:
Eso da como resultado una lista que contiene "me", "meyou" y "mow".
Puede optimizar eso haciendo el foreach con los predicados en una función totalmente diferente que OR todos los predicados.
fuente