277 messaggi dal 03 ottobre 2006
Sto usando questa porzione di codice per filtrare una query in linq to entities

private static Expression GetExpression<T>(ParameterExpression param, Filter filter)
{
MemberExpression member = Expression.Property(param, filter.PropertyName);
Type ty = Type.GetType(member.Type.FullName);
var t = Convert.ChangeType(filter.Value, ty);
ConstantExpression constant = Expression.Constant(t);

switch (filter.Operation)
{
case Op.Equals:
return Expression.Equal(member, constant);

case Op.GreaterThan:
return Expression.GreaterThan(member, constant);

c'è un sistema per far si che Op.Equals non sia case sensitive ?
mamber di fatto è la colonna del database e constant il valore che cerco di filtrare quindi su constant riuscirei anche a forzare un ToLower() ma come faccio a farlo su member ?

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
spiega bene la situazione in cui ti trovi. Perché hai bisogno di smanettare con l'albero di espressioni?

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Ho personalizzato una gridview con un custom control dove ho messo nella intestazione delle colonne dei textbox che mi filtrano i valori.
Le colonne contengono dati da un database e vorrei fare in modo che la ricerca fatta dal filtro non fosse case sensitive.
Ho trovato il codice che ho mostrato in precedenza davvero molto utile perchè gestisce la presenza di più filtri contemporanei e tutti i vari tipo come contains equal less then e così via
Però la ricerca che effettua con Expression.Equals è case sensitive mentre i dati contenuti nelle mie colonne hanno a volte la prima iniziale maiuscola ma non sempre.
Quindi vorrei che l'utente potesse, digitando milano, filtrare sia Milano che milano.
Per questo mi chiedevo come poter modificare Expression.Equals.

Se serve posto tutto il codice del filtroexpressionbuilder che uso e che mi genera l'espressione lambda per la query di Linq to entities

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
il fatto che l'operatore di uguaglianza sia case sensitive o case insensitive dipende dalla collation che hai usato sulla colonna del database. Entity Framework non ne è responsabile. Leggi qui:
https://stackoverflow.com/questions/3843060/linq-to-entities-case-sensitive-comparison

Comunque, quello che volevo dire è: perché in questo caso manipolare l'albero delle espressioni quando potresti raffinare la query con degli if o degli switch oppure usare DynamicLinq?

ciao,
Moreno
Modificato da BrightSoul il 16 dicembre 2018 14.16 -

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Ciao Moreno
in effetti speravo ci fosse una soluzione diversa da quella di agire su Expression.Equal e l'idea di cambiare la collation delle colonne direttamente sul DB mi piace molto anche perchè la comprendo meglio dei DynamiqLinq che andrò ora a studiare
Mi ero imbarcato nell'uso di query multiple per valutare prima con lettere maiuscole e poi minuscole ma è improponibile quando si vuole filtrare su più campi contemporaneamente.
Il cambio collation dovrebbe funzionare alla grande, ora provo
Grazie
277 messaggi dal 03 ottobre 2006
A proposito, dato che non ho ancora creato il DB di produzione e che uso il code first, c'è un sistema per far si che l'initial migration generi la creazione di tabelle con la collation che piace a me ? O devo modificarle io a mano prima di eseguire l'update-database ?
277 messaggi dal 03 ottobre 2006
mi pareva troppo bello :-)
eseguendo questa query direttamente sul DB con LinqPad
ListBarche.Where<Barca>(t => t.Regione == "veneto")
mi restituisce anche le barche che sono nella regione "Veneto"
tra l'altro senza eseguire il cambio di collation quindi probabilmente il DB aveva già le colonne con collation non case sensitive

Ma se invece eseguo queste dal codice
Func<Barca, bool> deleg = FiltroExpressionBuilder.GetExpression<Barca>(filtro).Compile();
var data = _db.ListBarche.ToList();
return data.Where<Barca>(deleg).AsQueryable();

mi ritorna zero righe

anche se FiltroExpressionBuilder.GetExpression apparentemente mi costruisce la lambda expression "t => t.Regione == "veneto""

quindi deduco che le istruzioni da codice facciano altro ma non capisco cosa...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.