Voy a comenzar con esto estoy buscando activamente la solución a este problema, pero pensé que podría acortar un poco el tiempo de investigación y desarrollo si alguien aquí en la pila ya se ha dado cuenta. (No he encontrado nada en línea así que aquí va)Encadenar las condiciones OR en EF 5.0
Tenemos un caso en un marco de aplicación que estamos construyendo donde necesitamos la capacidad de tomar en un conjunto de Predicados (List<Expression<Func<T,bool>>>
) y analizarlo en un marco de búsqueda.
En este momento tenemos la capacidad para filtrar de esta manera es que:
//Assume predicates is passed as a method argument.
// of List<Expression<Func<T,bool>>>
//Assume user is passed in as a method argument.
//Assume FilterToUserAccess is a custom extension method that restricts the dataset
// to access restrictions.
var query = _dbContext.Set<EntityType>()
.FilterToUserAccess(user);
foreach(var p in predicates){
query = query.Where(p);
}
return p.ToList();
La razón por la que tenemos que hacer esto es para ampliación de la capacidad de los objetos que se pueden filtrar. Sin embargo, para una búsqueda rápida esto no es posible debido a las capacidades integradas de EF. Lo que necesito hacer es:
Objeto A (imaginemos que es un coche de carreras) y queremos buscar marca, modelo, equipo y conductor en un cuadro de búsqueda rápida. Entonces, si ingreso "Earnhardt", buscará todas las propiedades de la entidad del auto de carrera que sean marca, modelo, equipo y controlador. Terminaría con todos los autos DEI y con Dale Jr. Me gustaría usar el mismo enfoque para poder configurar una entidad con capacidad de búsqueda y reflejar la configuración de búsqueda al inicio de la aplicación. Yo lo ideal sería realizar alguna manera de tener la consulta un aspecto similar a este:
//Assume predicates is passed as a method argument.
// of List<Expression<Func<T,bool>>>
//Assume user is passed in as a method argument.
//Assume FilterToUserAccess is a custom extension method that restricts the dataset
// to access restrictions.
var query = _dbContext.Set<EntityType>()
.FilterToUserAccess(user);
foreach(var p in predicates){
query = query.Or(p);
}
return p.ToList();
que se dan cuenta de que puedo hacer:
_dbContext.Set<EntityType>().Where(predicate1 || predicate2 || predicate3)
Sin embargo, esto no va a funcionar para el enfoque que queremos dar a resuelve este problema. Lo ideal es que un administrador de uno de nuestros sitios cliente pueda ingresar y configurar un término de búsqueda adicional con un solo clic para ser incluido en todas y cada una de las búsquedas rápidas para ese tipo de entidad como actualmente podemos realizar con los filtros que usan el estándar .Where(...)
"y" encadenando lógica.
Tendrá que crear un árbol de expresiones dinámicamente. –
¿Hay posibles lugares de partida para esto? Conozco los conceptos básicos de la generación de un árbol de expresión, pero me temo que este agujero de conejo es bastante profundo y rápido. Cualquier referencia sería muy apreciada. – VulgarBinary
Puede consultar LinqKit/Expression Builder. EB funciona para EF y hace que sea muy fácil encadenar condiciones de 'OR'. –