0

いくつかの複雑なクエリ パターンを拡張メソッドにラップしようとしてIQueryable<Foo>いますが、それらの中でいくつかの外部結合を実行する必要がある場合があります。

static IQueryable<Foo> Filter(this IQueryable<Foo> foos, params string[] searchTerms)
{
    //...
    return from t in session.Query<Tags>()
           from f in foos
           where
               (t.Name.Contains (searchTerms[0] && f.Tags.Contains(t))
               || f.Name.Contains(searchTerms[0]
           select f;
}

別のケースでは、いくつかの保存操作を実行するためにセッション アクセスが必要です (そうです、そうです、副作用は悪いです。クエリ パターンを追跡するためです)。

最初のケースでは、タグのコレクションを引数として渡すことでこれを回避しました。これは、呼び出し元にとっては少し醜いですが、うまく機能しますが、明らかにスケーリングしません。私が行った唯一の他のオプション一般的なケースでこれを理解するために推測できるのは、ISessionを直接渡すことです。

私が気に入っているのは、拡張メソッドから呼び出すことができる次のようなヘルパー メソッドを用意することです。

static ISession GetSession<T> (IQueryable<T> query)
{
    // do magic
}

クエリ可能なもの、クエリプロバイダー、または何かを Nh* にダウンキャストする必要がある場合でも、セッションを渡すよりも好むと思います。しかし、これにアクセスする方法が見つかりませんでした(セッションプロパティNhQueryProviderは保護されています)。これを式から取り出す他の方法がありませんか?

4

2 に答える 2

2

リフレクションを使用する必要があります。

IQueryable<Product> query = Session.Query<Product>();
ISession session = query.Provider.GetType().GetProperty("Session", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(query.Provider, null) as ISession;
于 2013-06-07T18:16:57.563 に答える
0

QueryObjectパターンを使用することでメリットが得られると思います-パラメーターを受け取り、そのパラメーターでクエリを呼び出す
メソッドを定義します。 文字列配列ソリューションに頼る代わりに、クエリオブジェクトのプロパティを使用してさまざまな検索用語を定義できます。 ISession

アイエンデは少し涼しい味がします

于 2012-08-27T19:58:41.980 に答える