Я пытаюсь создать более общие функции запросов в своем приложении. То, что я хотел бы сделать, это определить объекты, которые задают предикатное выражение, могут применять это к iqueryable со значением, которое будет передано позже.Как преобразовать выражение LINQ, когда у вас нет одного из параметров при его определении
Я считаю, что приведенный ниже код должен продемонстрировать, что я пытаюсь сделать достаточно хорошо, чтобы понять проблему. Пожалуйста, дайте мне знать, если вы хотите получить более подробную информацию!
Спасибо!
//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);
}
Это не совсем очевидно, - что InjectParameterInfoCriters хотел сделать? –
Вы хотите, чтобы потребитель этой функции мог изменять весь фильтр или только параметр фильтра. Если вы хотите только изменить параметр фильтра, вам просто нужно изменить файл usablefilter на Func и установить его как лямбда в переменной FilterDefinition. Дайте немного больше определения, и вы наверняка получите какой-то полезный код от кого-то. –