いくつかの複雑なクエリ パターンを拡張メソッドにラップしようとして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
は保護されています)。これを式から取り出す他の方法がありませんか?