Sto facendo una domanda comune nel mio progetto. Uso Expression per creare il mio albero di query, l'elenco di codici riportato di seguito:
public IList<Book> GetBooksFields(string fieldName, string fieldValue)
{
ParameterExpression paramLeft = Expression.Parameter(typeof(string), "m." + fieldName);
ParameterExpression paramRight = Expression.Parameter(typeof(string), "\"" + fieldValue + "\"");
ParameterExpression binaryLeft = Expression.Parameter(typeof(Book),"m");
BinaryExpression binaryExpr = Expression.Equal(paramLeft, paramRight);
var expr = Expression.Lambda<Func<Book, bool>>(binaryExpr, binaryLeft);
return bookRepository.GetMany(expr).ToList();
}
Ma quando invoco il mio metodo GetBooksFields
, mi verrà GetBooksFields
un'eccezione come di seguito:
Ho eseguito il debug della variabile expr e ho ottenuto l'espressione corretta: { m => (m.Name == "sdf")
}, era quello che volevo, ma non so perché ho ricevuto l'errore, grazie.
Non è possibile "ingannare" LINQ nell'interpretazione dei parametri come espressioni membro inserendo punti nei nomi di variabili.
Dovrai costruire correttamente l'albero delle espressioni, come di seguito (MODIFICA: campo modificato in proprietà secondo il tuo commento):
public IList<Book> GetBooksFields(string propertyName, string propertyValue)
{
var parameter = Expression.Parameter(typeof(Book), "book");
var left = Expression.Property(parameter, propertyName);
var convertedValue = Convert.ChangeType
(
propertyValue,
typeof(Book).GetProperty(propertyName).PropertyType
);
var right = Expression.Constant(convertedValue);
var binaryExpr = Expression.Equal(left, right);
var expr = Expression.Lambda<Func<Book, bool>>(binaryExpr, parameter);
return bookRepository.GetMany(expr).ToList();
}