Le paramètre '***' n'était pas lié dans l'expression de requête LINQ to Entities spécifiée

.net c# expression expression-trees linq

Question

Je fais une requête commune dans mon projet. J'utilise Expression pour construire mon arbre de requête, la liste de codes ci-dessous:

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

    }

Mais lorsque GetBooksFields ma méthode GetBooksFields , une exception est GetBooksFields , comme ci-dessous: entrez la description de l'image ici

J'ai débogué la variable expr et obtenu l'expression correcte: { m => (m.Name == "sdf") }, c'était ce que je voulais, mais je ne sais pas pourquoi j'ai l'erreur, merci

Réponse acceptée

Vous ne pouvez pas "inciter" LINQ à interpréter les paramètres en tant qu'expressions membres en ajoutant des points aux noms de variables.

Vous devrez construire l'arborescence des expressions correctement, comme ci-dessous (EDIT: champ modifié en propriété selon votre commentaire):

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi