1

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

そこにいるすべての善良なサマリア人に前もって感謝します。

PS

NHibernate にはすでに Linq を使用しています。ただし、これは 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式で完全に強く型付けされているため、このアプローチは好きではありません。次に、テーブル名とプロパティ名、および文字列の操作に関連する必要がありました。

私はNHibernate3.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文字列に変換できないことに固執しています。誰かがこれについて何か意見がありますか?または、別の方法で問題を解決しましたか?

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

于 2011-01-17T14:41:22.480 に答える
0

クエリには LINQ を使用し、削除と更新には HQL を使用します。Criteria でさえ、LINQ の代わりに役立つ場合があります。

どちらか一方の状況ではありません。各ジョブに最適なツールを選択できますし、選択する必要があります。

于 2009-08-25T12:40:52.113 に答える