Prevedo questo con sto cercando attivamente la soluzione a questo problema ma ho pensato che potrei abbreviare alcuni tempi di ricerca e sviluppo se qualcuno qui in pila lo ha già capito. (Non ho trovato nulla online, ecco qui)Concatenamento O condizioni in EF 5.0
Abbiamo un caso in un framework di applicazione che stiamo costruendo dove abbiamo bisogno della capacità di prendere in una serie di Predicati (List<Expression<Func<T,bool>>>
) e analizzarlo in un framework di ricerca.
In questo momento abbiamo la capacità di filtrare in questo modo è che:
//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();
Il motivo abbiamo bisogno di fare questo è per scale-capacità di oggetti filtrabili. Tuttavia per una ricerca rapida questo non è possibile date le funzionalità integrate di EF. Quello che devo essere in grado di fare è:
Oggetto A (facciamo finta che sia un'auto da corsa) e vogliamo cercare marca, modello, squadra e autista in una casella di ricerca rapida. Quindi, se inserisco "Earnhardt", cercherebbe tutte le proprietà delle entità delle auto da corsa come marca, modello, squadra e conducente. Vorrei finire con tutte le vetture dei DEI così come con Dale Jr. Vorrei utilizzare lo stesso approccio in modo da poter configurare un'entità ricercabile e riflettere la configurazione di ricerca all'avvio dell'applicazione. Vorrei ideale per fare qualche modo di avere la query simile a questo:
//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();
mi rendo conto che posso fare:
_dbContext.Set<EntityType>().Where(predicate1 || predicate2 || predicate3)
Tuttavia questo non funzionerà per l'approccio che vogliamo prendere per risolvi questo problema. Idealmente un amministratore per uno dei nostri siti clienti sarebbe in grado di entrare e configurare un termine di ricerca aggiuntivo con un solo clic per essere incluso in tutte le ricerche rapide per quel tipo di entità come possiamo attualmente utilizzare Filtri che utilizzano lo standard .Where(...)
"e" logica di concatenamento.
Sarà necessario creare un albero di espressioni in modo dinamico. –
Qualche possibile punto di partenza per questo? Conosco le basi della mano che generano un albero delle espressioni ma temo che questa tana del coniglio vada piuttosto in profondità molto velocemente. Qualsiasi riferimento sarebbe molto apprezzato. – VulgarBinary
È possibile verificare LinqKit/Expression Builder. EB funziona per EF e rende piuttosto facile concatenare le condizioni di 'OR'. –