J'essaie de créer une fonctionnalité de requête plus générique dans mon application. Ce que je voudrais faire est de définir des objets qui, étant donné une expression de prédicat, peuvent l'appliquer à un iqueryable avec une valeur qui sera transmise plus tard. Je crois que le code ci-dessous devrait démontrer ce que j'essaie de faire assez bien pour comprendre le problème. S'il vous plaît laissez-moi savoir si vous souhaitez plus de détails!Comment transformer une expression LINQ lorsque vous ne possédez pas l'un des paramètres lorsque vous la définissez
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);
}
Ce n'est pas vraiment évident - ce qui est InjectParameterInfoCriters censés faire? –
voulez-vous que le consommateur de cette fonction puisse changer le filtre entier ou seulement le paramètre de filtre. Si vous voulez seulement changer le paramètre de filtre, il vous suffit de changer le filtre usable en Func et de le définir comme le lambda dans la variable FilterDefinition. Donnez un peu plus de définition et vous obtiendrez sûrement du code utilisable de quelqu'un. –