2011-02-18 12 views
1

私は素晴らしいページングソリューションをセットアップしようとしているMVCプロジェクトを持っています。NHibernate - 動的QueryOverパラメータ

SQL Serverに、私がページングできるようにしたい数千の行を持つテーブルがいくつかあります。ページングに適用するフィルタがない場合は、うまく動作します。これは私がそれを行うために使用している方法である:

public virtual PagedList<T> GetPagedData(int startIndex, int count) { 
     var rowCount = session.CreateCriteria(typeof(T)).SetProjection(Projections.RowCount()).FutureValue<Int32>().Value; 
     var pageOfItems = session.CreateCriteria(typeof(T)).SetFirstResult(startIndex).SetMaxResults(count).List<T>(); 
     return new PagedList<T>(pageOfItems, startIndex, count, rowCount); 
    } 

私もさらにダウン結果を絞ると、新しいページングテーブルを返すために、クエリに渡す機能が欲しいです。私はこれまで持っていることである。これに

public virtual PagedList<T> GetPagedData<T>(int startIndex, int count, System.Linq.Expressions.Expression<Func<T, bool>> predicate) where T : class { 
     var rowCount = session.QueryOver<T>().Where(predicate).Select(Projections.RowCount()).FutureValue<Int32>().Value; 

     var pageOfItems = session.QueryOver<T>().Where(predicate).Skip(startIndex).Take(count).List<T>(); 
     return new PagedList<T>(pageOfItems, startIndex, count, rowCount); 
    } 

コールは次のようになります:

問題がある
networks = mRepository.GetPagedData<Network>(page ?? 1, pageSize, x => x.Name.Contains(q)); 

、それが表現「が含まれて」好きではありません。完全に一致すれば、それは正常に動作しますが(x.Name == q)、後の結果は得られません。

私が使用して見ている例外は、 "入って" です。

認識されていないメソッド呼び出し:誰がどのようにアイデアを持っています

ブールが含まれています(可能System.String):可能System.Stringこのような表現を動的に受け入れるには?私はこれを置いたベースリポジトリクラスを持っています、なぜなら私はいくつかの他のテーブルに対して同じタイプの振る舞いを使うからです。私はテーブルごとに別々のメソッドを書くことができましたが、可能ならば動的にやります。

アドバイスありがとうございます!

答えて

3

QueryOverはLINQではなく、非常に限定された式のセットしか受け入れません。

QueryOverQueryに置き換えて、LINQを使用するようにメソッドを書き直すことをお勧めします。唯一の問題は、それが将来のクエリを使用してカウントを行うには難しいということです(詳細についてはthis answerを参照)

ここで今後のないバージョンです:あなたが拡張メソッドIsLikeを使用する必要がQueryOver

public virtual PagedList<T> GetPagedData<T>(int startIndex, int count, 
       Expression<Func<T, bool>> predicate) where T : class 
{ 
    var query = session.Query<T>().Where(predicate); 
    var rowCount = query.Count(); 
    var page = query.Skip(startIndex).Take(count).List<T>(); 
    return new PagedList<T>(pageOfItems, startIndex, count, rowCount); 
} 
+0

アドバイスをいただきありがとうございます。これは完璧に機能しました。今後のクエリの使用方法については、その記事を参照していきますが、その間にうまく機能することを嬉しく思っています。 – Brosto

0

は、だからx.Name.IsLike(q, MatchMode.Anywhere)

関連する問題