Лучше сериализовать выражения NHibernate DetachedCriteria или LINQ-to-NHibernate через WCF? - PullRequest
2 голосов
/ 04 февраля 2010

Что я хотел бы сделать:
1. Создайте произвольный запрос LINQ на основе выбранных пользователем критериев, который будет
2. Запрос к прокси-коллекции (фасаду), которая
3. Преобразует запрос в NHibernate DetachedCriteria и сериализует ИЛИ просто сериализует выражение LINQ, а затем
4. Отправляет сериализованный запрос на сервер через WCF, где
5. Реализация сервиса выполняет запрос к прокси NHibernate, который
6. Выполните SQL-запрос к базе данных, который
7. Возвращает результат запроса, затем
8. NHibernate превращает результаты в коллекцию POCO, которая
9. WCF сериализуется, а затем
10. Возвращается в прокси коллекцию (фасад), которая окончательно
11. Возвращает результаты в код клиента.

Это кажется сумасшедшим количеством шагов, но требуется, чтобы клиент общался с сервером только через WCF.

Полагаю, первая часть этого вопроса звучит так: «Я делаю что-то глупое, что легче решить с помощью другой архитектуры, учитывая, что клиент не может получить доступ к базе данных напрямую?»

Вторая часть вопроса заключается в том, будет ли у меня меньше головной боли при попытке сериализации запросов как DetachedCriteria, или я смогу использовать один из доступных сериализаторов дерева выражений для сериализации запросов LINQ to NHibernate.

Я не хочу написать HQL или T-SQL в коде.

1 Ответ

0 голосов
/ 12 февраля 2010

Эй, Джей, как дела! ну, я думаю, что если WCF и функция динамического запроса клиента являются строгими требованиями, то это хороший план. Сериализаторы выражений, которые вы упомянули, определенно являются частью головоломки, с которой я буду придерживаться.

Другая потенциальная часть связана с применением этих выражений к nhibernate. Я никогда не использовал nhibernate, но если это что-то вроде фреймворка сущностей, у него возникнет проблема, если вы составите выражение запроса для POCO, которые не были сгенерированы фреймворком.

Вчера был опубликован новый проект с открытым исходным кодом:
http://boostmap.codeplex.com/

Одной из функций этой библиотеки является DataQueryProxy, который позволяет вам сделать IQueryable (т. Е. Ваше poco), но все выражения будут проксированы к IQueryable (т. Е. Ваш тип nHibernate).

Не уверен, поможет ли это вам, но удачи: -)

...