有人知道如何将LINQ表达式翻译成NHibernate HQL语句吗?

有人知道如何将LINQ表达式翻译成NHibernate HQL语句吗?,linq,nhibernate,hql,expression,Linq,Nhibernate,Hql,Expression,有人知道将LINQ表达式转换为HQL语句的现有解决方案吗 提前感谢所有的好心人 附言 我们已经使用Linq来实现NHibernate。但是,它只适用于select语句,而HQL适用于其他语句类型,如delete。所以,Linq to NHibernate不是答案。Linq to NHibernate刚刚是答案。这有帮助吗?使用LINQ进行查询,使用HQL进行删除和更新。即使是标准,有时也可以用来代替LINQ 这不是非此即彼的情况,您可以而且应该为每个作业选择最佳工具。我有完全相同的需求:我需要使

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

提前感谢所有的好心人

附言


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

Linq to NHibernate刚刚是答案。这有帮助吗?

使用LINQ进行查询,使用HQL进行删除和更新。即使是标准,有时也可以用来代替LINQ


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

我有完全相同的需求:我需要使用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;
            }
NhQueryable queryable=(来自session.Query()中的p)
其中p.ProductId==1
选择p)作为可查询项;
if(可查询!=null)
{
Expression=queryable.Expression;
NhQueryProvider=queryable.provider作为NhQueryProvider;
MethodInfo prepareQueryMethod=typeof(NhQueryProvider).GetMethod(“PrepareQuery”,BindingFlags.Instance | BindingFlags.NonPublic);
object[]arguments=新对象[]{expression,null,null};
NhLinqExpression NhLinqExpression=prepareQueryMethod.Invoke(provider,arguments)作为NhLinqExpression;
ExpressionToHqlTranslationResults translationResults=nhLinqExpression.ExpressionToHqlTranslationResults;
HqlQuery hql=translationResults.Statement作为HqlQuery;
}
我无法将HqlQuery对象转换为HQL字符串。有人对此有什么意见吗?或者你用不同的方式解决了你的问题


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

我已经在使用它了。它只能执行选择操作,而HQL可以用于其他操作,如delete。HQL是特定于NHibernate的,因此是服务器端DAL实现的详细信息。我不希望它“泄漏”到客户端,客户端请求删除一些实体。因此,客户机指定了一个linq表达式。当请求是fetch-simple时,因为有linq到nhibernate,它将其转换为条件,然后根据条件进行选择。然而,根据标准并没有delete语句,这是一个问题。这完全是另一个问题。。。请创建另一个问题来解决此问题。在IMO中使用多层时,不应允许客户端发送自己的linq表达式。重复:不完全允许。我也注意到了这个问题,甚至回答了这个问题。我冒昧地将你的发现重新发布在NH的专用邮件列表上。这个帖子周围有一些流量-需要您采取行动。帖子的URL是