2009-08-25 7 views
1

LINQ式をHQLステートメントに変換する既存のソリューションを知っている人はいますか?LINQ式をNHibernate HQLステートメントに変換する方法を知っている人はいますか?

事前にすべての良いサマリタンに感謝します。

P.S.

すでにLinqをNHibernateに使用しています。ただし、select文でのみ動作しますが、HQLはdeleteなどの他の文の種類に適しています。だから、NHibernateへのLinqは答えではありません。

+0

重複:http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco

+1

私はその質問に気づき、それにも答えました。 – mark

答えて

2

Linq to nhibernateはちょうどreleasedでした。それは役に立ちますか?

+0

私はすでにそれを使用しています。 HQLは削除のような他の操作でも使用できますが、選択は可能です。だから、それは助けにならない。 – mark

+0

よろしいですか?適切に質問を編集することをお勧めします。 –

0

クエリにはLINQを使用し、削除と更新にはHQLを使用します。 LINQの代わりに偶数の基準を使用することもできます。

どちらの場合でも、各ジョブに最適なツールを選ぶことができます。

+0

HQLはNHibernate固有であり、それ自体がサーバー側のDAL実装の詳細です。私は、クライアント側にいくつかのエンティティを削除することを要求する "リーク"したくないです。したがって、クライアントはlinq式を指定します。 linq to nhibernateが存在するため、要求がフェッチされると、単純なものになります。これは、それを基準に変換してから選択します。ただし、基準による削除ステートメントは存在せず、それが問題です。 – mark

+1

それは別の質問です...それに対処する別の質問を作成してください。複数の層のIMOを使用する場合は、クライアントが独自のlinq式を送信することを許可しないでください。 –

+0

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

1

私はまったく同じ必要性を持っていました.LINQ式を使って削除する必要がありましたが、Hibernateまたは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; 
      } 

私は、私はHQL文字列にHqlQueryオブジェクトを変換することはできませんよということにこだわっています。誰でもこれについて何か入力がありますか?それとも別の方法で問題を解決しましたか?

とにかく、パラメータとしてIQueryableまたはIQueryを使用したISession.Deleteのオーバーロードがあることは素晴らしいことだと思います。私はNHibernateの初心者ですが、NHibernateがいくつかの既存のメソッドを見つけ、それらを結びつけて仕事をすることを知っている人にとっては、かなり簡単な作業であるはずです。

+0

私はあなたに再転職の自由を取った専用のNHメーリングリストの所見この記事の周りにはトラフィックがあります。あなたの行動は必須です。投稿URLはhttp://groups.google.com/group/nhusers/browse_thread/thread/07cff495aa5f12e1です – mark

関連する問題