У меня была точно такая же потребность: мне нужно было удалить, используя выражение 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, должно быть довольно простой задачей найти некоторые уже существующие методы и подключить их для выполнения работы.