2010-07-08 2 views
0

Я пытаюсь создать более общие функции запросов в своем приложении. То, что я хотел бы сделать, это определить объекты, которые задают предикатное выражение, могут применять это к 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); 
} 
+0

Это не совсем очевидно, - что InjectParameterInfoCriters хотел сделать? –

+0

Вы хотите, чтобы потребитель этой функции мог изменять весь фильтр или только параметр фильтра. Если вы хотите только изменить параметр фильтра, вам просто нужно изменить файл usablefilter на Func и установить его как лямбда в переменной FilterDefinition. Дайте немного больше определения, и вы наверняка получите какой-то полезный код от кого-то. –

ответ

0

Вы ищете что-то в этом роде?

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

См: Currying

+0

спасибо dtb, это было именно то, что мне действительно нужно было сделать. – eoldre

0

Поместите следующий код в вашем теле ApplyFilter:

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