Il parametro '***' non è stato associato nell'espressione di query LINQ to Entities specificata

.net c# expression expression-trees linq

Domanda

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: inserisci la descrizione dell'immagine qui

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.

Risposta accettata

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();          
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché