2

NHibernate セッション オブジェクトの IQueryOver インターフェイスを、静的クラスでレコードを選択する基準として LINQ 式と共に使用しようとしています。Expression<Func<T, object>>LINQ 式は、オブジェクト T の値を取得するためにマッピング クラスで定義されます。

public void SearchParameter(Expression<Func<T, object>>)

これらのパラメーターは、マッピング クラスを拡張することによって追加されます。

public MyMapping : FindMap<MyNHibernateMappedObject>
{
    public MyMapping()
    {
        this.SearchParameter(x => x.SomeColumn);
    }
}

私の Find クラスは、時間軸で同じタイプの前後のレコードを取得するための静的メソッドを定義します。各検索パラメーターは、両方のレコードで同一である必要があります。

Find クラスは、マッピング構成から検索パラメーターを取得し、.Compile() で式をコンパイルします。だから私は GetQueryWithSearchParameters メソッドを持っています:

private static Func<T, object> searchParameter;

...

public static IQueryOver<T, T> GetQueryWithSearchParameters(ISession session, T current)
{
    var query = session.QueryOver<T>()
                       .Where(x => searchParameter(x) == searchParameter(current));
    return query;
}

ただし、クエリを作成すると、次の例外が発生します。

System.InvalidOperationException: variable 'x' of type MyNHibernateMappedObject' referenced from scope '', but it is not defined

ここで何が起こっているのか正確にはわかりませんが、デリゲートで x が利用できないのではないかと思います。ここで何が間違っていますか?

4

1 に答える 1

0

session.QueryOver().Where(...) は式を受け取るため、式を評価してクエリに変換しようとします。searchParameter(x) == searchParameter(current) を SQL クエリに変換しようとしますが、その方法はわかりません。

これを機能させるには、コードで式を作成する必要があります (ラムダ式を使用しないでください)。ただし、これは骨の折れる作業になると思います。Criterion を作成してそれを QueryOver に追加する方がはるかに簡単であることがわかると思います。

于 2012-09-05T15:24:16.393 に答える