1

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

在此先感谢所有好心人。

附言

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

4

3 回答 3

2

Linq to nhibernate 刚刚发布。这有帮助吗?

于 2009-08-25T10:17:53.867 回答
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 字符串。有人对此有任何意见吗?或者您是否以不同的方式解决了您的问题?

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

于 2011-01-17T14:41:22.480 回答
0

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

这不是非此即彼的情况,您可以而且应该为每项工作选择最好的工具。

于 2009-08-25T12:40:52.113 回答