Вам нужно построить выражение вместо функции:
Expression<Func<Record, bool>> filter =
record => record.Field1.ToLower().Contains(term); // rest omitted
Лямбда-выражение остается прежним, но вам нужно вернуть его в переменную типа Expression<Func<Record, bool>>
- которая сделаетКомпилятор C # компилирует его как выражение, а не делегат, что позволяет передавать его в LINQ to SQL.
Однако вы не сможете использовать переменную выражения с C # -синтаксисом условия where: youВам нужно будет использовать метод расширения Where:
var results = DataContext.Records.Where(filter);
Отредактировано, чтобы добавить: Если вы хотите иметь возможность создавать фильтры на разных условиях, вам просто нужен метод для созданиявыражение из термина:
private static Expression<Func<Record, bool>> Filter(string term)
{
return r => r.Field1.ToLower().Contains(term);
}
var results = DataContext.Records.Where(Filter(term));
Если вы предпочитаете сохранять filter
лямбда-выражением, как в данный момент, вы можете сделать это, но обобщенные элементы немного вложены:
Func<string, Expression<Func<Record, bool>>> filter =
term => (r => r.Field1.ToLower().Contains(term));
var results = DataContext.Records.Where(filter(term));
Несмотря на это, важно то, что в предложении Where должно быть указано Expression<Func<Record, bool>>
, но, как показано выше, вы можете сделать выражение зависимым от term
, построив подходящее выражение на лету.Именно это будет делать LINQ to SQL, если вы укажете от руки фильтр в предложении Where.