Звучит так, будто вы ищете что-то вроде шаблона Спецификация .
Здесь есть отличная статья, посвященная шаблону EF4 / POCO / Repository / Specification здесь .
Хотя мне нравится шаблон, я нахожу его немного излишним в простых сценариях.
В итоге я применил технику "каналов и фильтров" - в основном IQueryable<T>
методы расширения для ваших объектов, чтобы сделать ваш код репозитория свободным.
Однако для критериев поиска я хотел бы разрешить потребляющему коду предоставлять предикат, тогда вам не нужно беспокоиться о параметрах.
Итак, определение будет таким:
public People SearchPeople(Expression<Func<People,bool>> predicate)
{
return _context.People.SingleOrDefault(predicate);
}
Тогда код просто предоставляет предикат.
var person = _repository.SearchPeople(p => p.Age > 30 && p.Height > 80);
Некоторым людям не нравится этот метод, поскольку он дает слишком много «мощности» потребителю, потому что они могут предоставить предикат, такой как p.Id > 0
, и вернуть все строки в базе данных.
Чтобы противодействовать этому, предоставьте необязательный параметр для maxRows. Если он не указан, по умолчанию используется 100 строк.