使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してシステムを。 使用してSystem.Linq.Expressionsを。 使用したSystem.Diagnosticsを。 名前空間SportsStore.Models.Pages { パブリック クラス PagedList <T>:リスト<T> { パブリック PagedList(のIQueryable <T>クエリ、QueryOptionsオプション= NULL ){ currentPageに = options.CurrentPage。 PageSize = options.PageSize。 オプション = オプション。 もし(オプション!= nullの){ もし(!文字列.IsNullOrEmpty(options.OrderPropertyName)){ クエリ = 注文(クエリ、options.OrderPropertyName、 options.DescendingOrder)。 } もし(!ストリング.IsNullOrEmpty(options.SearchPropertyName) &&!ストリング.IsNullOrEmpty(options.SearchTerm)){ クエリ = 検索(クエリー、options.SearchPropertyName、 options.SearchTerm)。 } } // ストップウォッチSW = Stopwatch.StartNew()。 //Console.Clear(); TotalPages = query.Count()/ がPageSize。 AddRange(query.Skip((currentPageに - 1)* がPageSize).Take(がPageSize))。 // Console.WriteLineを($ "問合せ時間:{} sw.ElapsedMilliseconds MS"); } 公共 のint currentPageに{ 得ます。セット; } 公共 のintがPageSize { 得ます。セット; } 公共 のint TotalPages { 得ます。セット; } 公共 QueryOptionsオプション{ 取得; セット; } パブリック ブール HasPreviousPage => currentPageに> 1 。 パブリック ブール HasNextPage => currentPageに< TotalPages。 プライベート 静的のIQueryable <T>検索(のIQueryable <T>クエリ文字列プロパティ名、 文字列検索語){ VARのパラメータ= Expression.Parameter(typeof演算(T)、" X " )。 VaRのソース= propertyName.Split(' ' ).Aggregate((式)パラメータ、 Expression.Property)。 VAR体= Expression.Call(ソース、" 入って" 、Type.EmptyTypes、 Expression.Constant(SEARCHTERM、typeof演算(文字列))); VARラムダ= Expression.Lambda <のFunc <T、BOOL >> (本体、パラメータ)。 返すquery.Where(ラムダ); } プライベート 静的のIQueryable <T>注文(のIQueryable <T>クエリ文字列プロパティ名、 ブールDESC){ VARのパラメータ= Expression.Parameter(typeof演算(T)、" X "); VaRのソース= propertyName.Split(' ' ).Aggregate((式)パラメータ、 Expression.Property)。VaRのラムダ= Expression.Lambda(typeof演算(機能<、>)MakeGenericType(typeof演算(T)、 source.Type)、ソース、パラメータ)返すtypeof演算(照会可能).GetMethodsを()シングル(。 メソッド => method.Name ==(DESC?" OrderByDescending " :" のOrderBy " ) && method.IsGenericMethodDefinition && method.GetGenericArguments()。長さ== 2 && method.GetParameters()。長さ== 2 ) .MakeGenericMethod(typeof演算(T)、source.Type) .Invoke(ヌル、新しい オブジェクト [] {クエリラムダ})などのIQueryable <T> 。 } } }
公共 PagedList <カテゴリ> GetCategories(QueryOptionsオプション){ 返す 新しい PagedList <カテゴリ> (context.Categories、オプション)。 }
名前空間SportsStore.Models.Pages { パブリック クラスQueryOptions { 公共 のint currentPageに{ 取得します。セット ; } = 1 。 公共 int型のPageSize { 取得します。セット ; } = 10 。 公共の 文字列 OrderPropertyName { 取得します。セット; } パブリック ブール DescendingOrder { 得ます。セット; } パブリック 文字列 SearchPropertyName { 得ます。セット; } パブリック 文字列検索語{ 得ます。セット; } } }