Кто-нибудь знает, как перевести LINQ Expression в оператор NHibernate HQL? - PullRequest
1 голос
/ 25 августа 2009

Кто-нибудь знает о существующем решении для перевода выражения LINQ в оператор HQL?

Заранее спасибо всем добрым самаритянам.

приписка

Мы уже используем Linq для NHibernate. Однако он работает только для операторов выбора, тогда как HQL хорош для других типов операторов, таких как удаление. Таким образом, Linq для NHibernate не является ответом.

Ответы [ 3 ]

2 голосов
/ 25 августа 2009

Линк к nhibernate был только что выпущен . Это помогает?

1 голос
/ 17 января 2011

У меня была точно такая же потребность: мне нужно было удалить, используя выражение LINQ, но NHibernate поддерживает удаление только с использованием HQL или SQL. Мне не нравится этот подход, так как остальная часть кода полностью строго типизирована с помощью выражения LINQ, и мне пришлось обратиться к именам таблиц и свойств и манипулировать строками.

Я работаю с NHibernate 3.0, и я прошел 95% пути, но мне пришлось использовать рефлексию для вызова некоторых частных / внутренних методов. Ниже приведен объект HqlQuery для выражения LINQ:

NhQueryable<Product> queryable = (from p in session.Query<Product>()
                             where p.ProductId == 1
                             select p) as NhQueryable<Product>;
            if (queryable != null)
            {
                Expression expression = queryable.Expression;
                NhQueryProvider provider = queryable.Provider as NhQueryProvider;
                MethodInfo prepareQueryMethod = typeof(NhQueryProvider).GetMethod("PrepareQuery", BindingFlags.Instance | BindingFlags.NonPublic);
                object[] arguments = new object[] {expression, null, null};
                NhLinqExpression nhLinqExpression = prepareQueryMethod.Invoke(provider, arguments) as NhLinqExpression;
                ExpressionToHqlTranslationResults translationResults = nhLinqExpression.ExpressionToHqlTranslationResults;
                HqlQuery hql = translationResults.Statement as HqlQuery;
            }

Я застрял на том, что не могу преобразовать объект HqlQuery в строку HQL. Кто-нибудь есть какие-либо материалы по этому вопросу? Или вы решили свою проблему по-другому?

В любом случае, я думаю, что было бы отличным дополнением иметь перегрузку ISession.Delete, которая принимала IQueryable или IQuery в качестве параметра. Я новичок в NHibernate, но мне кажется, что для кого-то, знающего NHibernate, должно быть довольно простой задачей найти некоторые уже существующие методы и подключить их для выполнения работы.

0 голосов
/ 25 августа 2009

Используйте LINQ для запросов, HQL для удаления и обновления. Даже Критерии все еще могут быть полезны иногда вместо LINQ.

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

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