Я пытаюсь построить IQueryable
, который будет оцениваться моей моделью сущности.Я хочу передать ему две группы лямбд и сделать так, чтобы все было составлено в более сложное дерево выражений, которое передается в базу данных для выполнения.
Вот что у меня есть:
public class FilterManager<T>
{
public List<Expression<Func<T, bool>>> Inclusive { get; set; }
public List<Expression<Func<T, bool>>> Exclusive { get; set; }
public IQueryable<T> ApplyFilters(IQueryable<T> query)
{
var q = query;
Exclusive.ForEach(exp => q = q.Where(exp)); //works fine
Inclusive.ForEach(exp => /* ??? */);
return q;
}
//ctor, etc.
}
Идея в том, что я добавляю несколько выражений к Inclusive
, которые объединяют их в "Ors".Например, если T
является int
, код:
fm.Inclusive.Add(x => x > 1);
fm.Inclusive.Add(y => y < 5);
query = fm.ApplyFilters(query);
должен иметь такой же набор результатов, как:
query = query.Where(z => z > 1 || z < 5);
Как мне получить Inclusive
дляработать без сторонних инструментов, таких как PredicateBuilder?Сторонние инструменты обычно хороши, но я хотел бы улучшить мое понимание того, как составлять выражения в .NET.
Мне также нужно убедиться, что дерево еще не будет оценено, чтобыЯ могу сделать фильтрацию по базе данных.Это означает, что мне нужно будет произвести что-то, что может потреблять Entity Framework 4.0.