有谁知道如何将LINQ Expression转换为NHibernate HQL语句?

时间:2009-08-25 10:12:19

标签: linq nhibernate hql expression

有没有人知道将LINQ表达式转换为HQL语句的现有解决方案?

提前感谢所有优秀的撒玛利亚人。

P.S。

我们已经将Linq用于NHibernate。但是,它仅适用于select语句,而HQL适用于其他语句类型,如delete。所以,Linq对NHibernate不是答案。

3 个答案:

答案 0 :(得分:2)

Linq to nhibernate刚刚released。这有帮助吗?

答案 1 :(得分:1)

我有完全相同的需求:我需要使用LINQ表达式删除,但NHibernate仅支持使用HQL或SQL进行删除。我不喜欢这种方法,因为其余代码完全用LINQ表达式强类型化,然后我必须与表和属性名称以及操作字符串相关联。

我正在使用NHibernate 3.0,我95%的方式来了,但我不得不使用反射来调用一些私有/内部方法。下面给出了一个LINQ表达式的HqlQuery对象:

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字符串。有人对此有任何意见吗?或者您是否以不同的方式解决了问题?

无论如何,我认为将ISuion.Delete重载为一个很好的补充,它将IQueryable或IQuery作为参数。我是NHibernate的新手,但在我看来,对于那些知道NHibernate找到一些已经存在的方法并将它们连接起来完成这项工作的人来说应该是一个相当简单的任务。

答案 2 :(得分:0)

使用LINQ进行查询,使用HQL进行删除和更新。甚至Criteria有时候仍然有用而不是LINQ。

这不是一种或两种情况,你可以而且应该为每项工作挑选最好的工具。