Asp.netコアソース-PagedList <T>

使用して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 { 得ますセット; }
         パブリック 文字列検索語{ 得ますセット; } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/YrRoom/p/11070248.html