Как построить построитель предикатов или критериев для вашего DAL, который понимает лямбды? - PullRequest
1 голос
/ 15 декабря 2009

Я работаю над дизайном уровня доступа к данным, мы еще не доработали, какой ORM мы собираемся использовать. Я склоняюсь к NHibernate + FluentMappings + Nhibernate.Linq, но в зависимости от сроков проекта мы можем даже ждать EF4. Я хочу заменить методы, такие как:

IList<Customer> FindById(int id);

IList<Customer> FindByName(string fullName);

до

IList<Customer> FindByCriteria(Func<Customer, bool> criteria);

или даже

IList<T> FindByCriteria(Func<T, bool> criteria)

поэтому идея состоит в том, чтобы динамически связать или построить критерии, основанные на требованиях (от пользовательского интерфейса или бизнеса), к хранилищу или объекту DAO. Любые примеры кода, ссылки, сообщения в блогах, советы приветствуются.

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 15 декабря 2009

Если вы хотите работать только с лямбдами, вам придется иметь дело с классом System.LINQ.Expression. Позволяет получить доступ к коду, который представляет лямбда.

Типы вокруг IQueryable также могут быть вам интересны.

2 голосов
/ 15 декабря 2009

Если вы пишете ORM, то вам следует задать этот вопрос.

Если вы пишете приложение, построенное поверх ORM, оно уже должно иметь возможность выражать общие запросы (такие как выражения LINQ). Ваша задача для вашего приложения состоит в том, чтобы использовать эту общую возможность запросов в системных запросах, таких как «найти клиента по имени».

Общие запросы - это уровень абстракции непосредственно под специфичными для приложения запросами. Хранилища сами по себе не должны содержать общих возможностей.

См. Мой ответ здесь для получения дополнительной информации и примера кода:

Преимущество создания общего хранилища по сравнению с конкретным хранилищем для каждого объекта?

2 голосов
/ 15 декабря 2009

Ссылка на первый пост серии ниже. Не на 100%, но применима общая концепция. ORM, используемый в статье, - LLBLGen Pro, но он должен применяться к любой зрелой платформе ORM:

Объекты динамического поиска, часть 1 - Введение

...