277 messaggi dal 03 ottobre 2006
Ho eliminato il ToList() dalle righe precedenti quindi ora il codice è:

Func<Barca, bool> deleg = FiltroExpressionBuilder.GetExpression<Barca>(filtro).Compile();
var data = _db.ListBarche;
return data.Where<Barca>(deleg).AsQueryable();

ma restituisce ancora zero righe mentre questa, sempre da codice,
return data.Where<Barca>(t => t.Regione == "veneto").AsQueryable();

mi restituisce anche le righe con regione = "Veneto" come vorrei io...

Può essere il "Compile()" che causa il problema?
11.886 messaggi dal 09 febbraio 2002
Contributi
Prova a loggare la query che EF invia al database, magari vedendola avrai un indizio sulla causa del problema.

Per Entity Framework 6:
https://docs.microsoft.com/it-it/ef/ef6/fundamentals/logging-and-interception

Per Entity Framework Core:
https://docs.microsoft.com/it-it/ef/core/miscellaneous/logging


ciao,
Moreno

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Uso Entity Framework 6 ma non riesco nemmeno a fare ciò che mi hai chiesto

Ho messo

var logger = new MyLogger();
_db.Database.Log = s => logger.Log("EFApp", s);

Func<Barca, bool> deleg = FiltroExpressionBuilder.GetExpression<Barca>(filtro).Compile();
var data = _db.ListBarche.ToList();
return data.Where<Barca>(deleg).AsQueryable();

ma tutto ciò che la variabile s mi mostra è una query senza nessuno "where" all'interno ... non capisco.
In pratica, se il mio codice fosse scritto così
return data.Where<Barca>(t=>t.Regione == "veneto").AsQueryable();
funzionerebbe tutto alla grande cioè mi mostrerebbe sia le righe con "Veneto" che "veneto"

e dato che non funziona nulla vuol dire che la variabile "deleg" non vale "t=>t.Regione == "veneto"" ma non riesco nemmeno in debug a capire come è fatta :-(

Eppure la funzione FiltroExpressionBuilder.GetExpression<Barca>(filtro) finisce con
return Expression.Lambda<Func<T, bool>>(exp, param);
che catturata dal debug mi mostra questo:
Valore restituito: System.Linq.Expressions.Expression.Lambda<TDelegate>{t => (t.Regione == "veneto")}

quindi non so più cosa pensare... è il Compile() che rovina tutto ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


è il Compile() che rovina tutto ?

Non serve fare il Compile().

Dunque... se vuoi costruire dinamicamente una lambda expression come questa:
Func<Barca, bool> lambda = barca => barca.Provincia == "macerata";


Allora questo è il codice da usare:
var parameter = Expression.Parameter(typeof(Barca), "banca");
var property = Expression.Property(parameter, "Provincia");
var constant = Expression.Constant("macerata");
var equal = Expression.Equal(property, constant);
var lambda = Expression.Lambda<Func<Barca, bool>>(equal, new[] { parameter });


...e poi la usi così con EF.
var barcheDellaProvinciaDiMacerata = context.Barche.Where(lambda).ToList();


Ma ripeto la domanda: perché non usare Dynamic LINQ?

ciao,
Moreno

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
grazie Moreno
non uso ancora Dynamic Linq solo perchè non le conosco proprio. Dalla tua insistenza percepisco che sarebbe l'approccio migliore e ho dato solo una sbirciata ora per rendermi conto che potrebbe proprio fare al caso mio.
Proverò prima il tuo suggerimento con le lambda expression perchè ormai è una questione di principio e poi perchè così avrei risolto rapidamente.

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.