0

私のシナリオは次のとおりです。次のフォームを実行するベース NHibernate クエリがあります ( DetachedCriteria を使用してコーディングしましたが、ここでは SQL 構文を使用して説明します)。

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key

この結合の結果を表示するユーザー インターフェイスでは、ユーザーは追加の条件を指定できます。次のように言います。

I.SomeField = 'UserValue'.

ここで、最終的なロード コマンドを次のようにする必要があります。

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key
WHERE I.SomeField = 'UserValue'

私の問題は次のとおりです。クエリの「静的」側面(トップ結合)で DetachedCriteria を作成し、UI がクエリの「動的」コンポーネントで DetachedCriteria を作成します。この 2 つを組み合わせて、NHibernate セッションで実行できる最終的なクエリにする必要があります。

DefaultCriteria.Add() は ICriterion を取ります (これは Expression クラスを使用して作成されます。また、問題の解決策となる可能性のある、私が知らない他のクラスも使用できます)。

誰かが私がやりたいことをする方法を知っていますか?

4

1 に答える 1

1

を使用GetExecutableCriteriaして、切り離された基準を特定のセッションの実行可能な形式に変換できます。

var query = DetachedCriteria.For<...>();

using (var session = ...)
using (var transaction = session.BeginTransaction())
{
    query.GetExecutableCriteria(session)
    transaction.Commit();
}

しかし、あなたのデザインには少し欠陥があると思います。UI は独自の条件を作成するのではなく、条件を補足する必要があります。最悪の場合、ICriterion実行前に基準に追加されるように生成する必要があります。せいぜい、フィルター機能を ORM テクノロジから完全に独立したレイヤーに抽象化し、UI からフィルターを基になる基準に適用する程度です。

于 2010-04-12T15:18:33.957 に答える