Comment transformer une expression LINQ lorsque vous ne possédez pas l'un des paramètres lorsque vous le définissez

StackOverflow https://stackoverflow.com/questions/3205608

Question

J'essaie de créer une fonctionnalité de requête plus générique dans mon application.Ce que je voudrais faire, c'est de définir des objets qui étant donné qu'une expression de prédicat peut s'appliquer qu'à une valeur iquérissable avec une valeur qui sera transmise plus tard.

Je crois que le code ci-dessous devrait démontrer ce que j'essaie de bien faire assez pour comprendre le problème.S'il vous plaît laissez-moi savoir si vous souhaitez plus de détails!

merci!

//in practice the value of this would be set in object constructor likely
private Expression<Func<Contact, string, bool>> FilterDefinition = (c, val) => c.CompanyName.Contains(val);

//this needs to filter the contacts using the FilterDefinition and the filterValue. Filterval needs to become the string parameter
private IQueryable<Contact> ApplyFilter(IQueryable<Contact> contacts, string filterValue)
{
     //this method is what I do know know how to contruct.
     // I need to take the FilterDefinition expression and create a new expression that would be the result if 'filtervalue' had been passed into it when it was created.
     //ie the result would be (if 'mycompany' was the value of filterValue) an expression of
     //  c => c.CompanyName.Contains("mycompany")
     Expression<Func<Contact, bool>> usableFilter = InjectParametersIntoCriteria(FilterDefinition, "SomeCompanyName");

     //which I could use the results of to filter my full results.
     return contacts.Where(usableFilter);
}

Était-ce utile?

La solution

cherchez-vous quelque chose comme ça?

private Func<string, Expression<Func<Contact, bool>>> FilterDefinition =
    val => c => c.CompanyName.Contains(val);

private IQueryable<Contact> ApplyFilter(
    IQueryable<Contact> contacts, string filterValue)
{
    Expression<Func<Contact, bool>> usableFilter = FilterDefinition(filterValue);

    return contacts.Where(usableFilter);
}

Voir: Currying

Autres conseils

Placez le code suivant dans votre corps ApplyFilter:

 var f = FilterDefinition.Compile();
 return contacts.Where(x => f(x, filterValue));

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top