2009-08-25 57 views
1

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

在此先感谢所有优秀的撒玛利亚人。

P.S.

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

+0

Duplicate:http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco 2009-08-25 18:48:04

+1

不完全。我也注意到了这个问题,甚至回答了这个问题。 – mark 2009-08-25 19:26:37

回答

2

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

+0

我已经在使用它了。它只能做选择,而HQL可以用于其他操作,比如删除。所以不,它没有帮助。 – mark 2009-08-25 10:22:49

+0

哦,好的。建议你适当地编辑你的问题。 – 2009-08-25 11:03:40

0

使用LINQ进行查询,使用HQL进行删除和更新。即使标准仍然可以有用,而不是LINQ。

这不是一种任何一种情况,你可以也应该为每项工作选择最好的工具。

+0

HQL是NHibernate特有的,因此是服务器端DAL实现细节。我不希望它“泄漏”到客户端,这是请求删除一些实体的端。所以,客户端指定一个linq表达式。当请求是获取 - 很简单,因为有linq到nhibernate,它将它转换为标准,然后由它选择。但是,按标准没有删除声明,这是一个问题。 – mark 2009-08-25 12:55:02

+1

完全是另一个问题...请创建另一个问题来解决这个问题。当使用多层IMO时,您不应允许客户端发送自己的linq表达式。 – 2009-08-25 13:21:59

+0

http://stackoverflow.com/questions/1330432/in-a-multitier-application-should-a-client-be-allowed-to-send-its-own-linq-expres – mark 2009-08-25 19:30:14

1

我有完全相同的需求:我需要使用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

我冒昧地转贴你的专门的NH邮件列表上的调查结果。这篇文章有一些流量 - 你的行为是必需的。帖子网址是http://groups.google.com/group/nhusers/browse_thread/thread/07cff495aa5f12e1 – mark 2011-01-18 09:12:42