Репозиторий, принимающий выражение linq для фильтрации - PullRequest
2 голосов
/ 03 февраля 2010

Я рассматриваю рефакторинг репозитория. Мне нужно улучшить его гибкость и уменьшить количество методов.

Там, где есть следующие методы:

Collection GetAllUsersByRole(Role role)
User GetUserByuserName(string userName)

... Я бы хотелесть один метод, использующий выражение Linq:

ICollection GetUsers(Expression e)
{
  //retrieve user collection from store
  //apply expression to collection and return
}

Это разумный подход?Предположительно, я бы потерял некоторую эффективность, потому что полную коллекцию пользователей нужно будет извлекать и фильтровать каждый раз, а не извлекать подмножество пользователей в соответствии с некоторыми жестко заданными критериями?

Редактировать: NHibernate предоставляет ORM в моемосуществление.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

Вы действительно хотите взять выражение в качестве аргумента этого метода.

Что касается производительности, то все зависит от того, насколько далеко вы хотите пойти с ней. Самый простой способ - перенести все объекты в память, а затем выполнить фильтрацию с помощью выражения предиката.

С другой стороны, вы упоминаете какие-то критерии. Я понятия не имею, какова ваша внутренняя система данных, но вы можете взять эти пропущенные фильтры и преобразовать их в ваши критерии. Это в основном то, что делают Linq to SQL и Linq to Entities, но, надеюсь, диапазон возможностей, которые вам нужно поддерживать, значительно меньше. Если нет, возможно, имеет смысл переключиться на один из инструментов ORM, если вы хотите использовать этот подход.

1 голос
/ 03 февраля 2010

Это не очень разумный подход, потому что обычно он будет стоить вам много проблем с производительностью. Если вы используете технологию доступа к данным, которая принимает запросы LINQ, вы просто можете использовать этот запрос (выражение) вместе с ним. Это может быть IQueryable для LINQ to SQL или ObjectQuery для EntityFramework. Это также может быть ICriteria (без поддержки linq) для nHibernate. Все современные инструменты ORM имеют собственный API-интерфейс для выражений, поэтому вам просто нужно его использовать. Если у вас есть пользовательский слой доступа к данным, вам потребуется написать собственный API для создания критериев, например Объект запроса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...