zoukankan      html  css  js  c++  java
  • 在网站开发中进行分页数据查询

    打了很多字然后浏览器崩了,没保存,心态大崩。。。

    -------------------------------正文开始分界线--------------------------------

    1,LINQ

    LINQ在c#3.0版本被加入,即便是你不用EF作为数据源,LINQ照样是.NET程序员绕不开的语法糖。

    在简单的查询中,我们可以用Linq中的SKIP/TAKE ,SKIP就是从数据源的第几条数据开始,TAKE就是查询的数据数量,所以在我们的日常的开发中,只要在linq语句的最后调用即可。

    但是我们平时用的泛型LIST<T>并不是继承Iqueryable,所以进行扩展。后再使用会显得更加优雅。

    -----------------------扩展list<T>的Iqueryable方法----------------------

     1    /// <summary>
     2     /// list扩展
     3     /// </summary>
     4     public static class ListExtensions
     5     {
     6         public static List<T> Where<T>(this List<T> list, Expression<Func<T,bool>> exp) {
     7 
     8            var rult = list.AsQueryable().Where<T>(exp).ToList();
     9 
    10             return rult;
    11         }
    12 
    13         public static List<T> Skip<T>(this List<T> list, int num)
    14         {
    15 
    16             var rult = list.AsQueryable().Skip<T>(num).ToList();
    17 
    18             return rult;
    19         }
    20         public static List<T> SkipWhile<T>(this List<T> list, Expression<Func<T, bool>> exp)
    21         {
    22 
    23             var rult = list.AsQueryable().SkipWhile<T>(exp).ToList();
    24 
    25             return rult;
    26         }
    27 
    28         public static List<T> Take<T>(this List<T> list, int num)
    29         {
    30 
    31             var rult = list.AsQueryable().Take<T>(num).ToList();
    32 
    33             return rult;
    34         }
    35         public static List<T> TakeWhile<T>(this List<T> list, Expression<Func<T, bool>> exp)
    36         {
    37 
    38             var rult = list.AsQueryable().TakeWhile<T>(exp).ToList();
    39 
    40             return rult;
    41         }
    42 
    43         public static List<T> OrderBy<T>(this List<T> list,string propName,bool isDesc =true) where T:class
    44         {
    45             if (!string.IsNullOrWhiteSpace(propName)) {
    46                 var rult = isDesc? list.AsQueryable().OrderByDescending(propName).ToList() : list.AsQueryable().OrderBy(propName).ToList();
    47                 return rult;
    48             }
    49             throw new Exception("It must has a property name for sort");
    50 
    51         
    52         }
    53     }
    LIST扩展

     --------------------对OrderBy<T>的扩展------------------------------

    因为在Iqueryable接口中,orderby只接受lambda表达式,在我的方法中没办法使用,因为我们不知道泛型T内的属性,所以用以下扩展。

     1  public static class IqueryableExtensions
     2     {
     3         #region orderby 扩展
     4 
     5 
     6         public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName)
     7         {
     8             return _OrderBy<T>(query, propertyName, false);
     9         }
    10         public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string propertyName)
    11         {
    12             return _OrderBy<T>(query, propertyName, true);
    13         }
    14 
    15         static IOrderedQueryable<T> _OrderBy<T>(IQueryable<T> query, string propertyName, bool isDesc)
    16         {
    17             string methodname = (isDesc) ? "OrderByDescendingInternal" : "OrderByInternal";
    18 
    19             var memberProp = typeof(T).GetProperty(propertyName);
    20 
    21             var method = typeof(ListExtensions).GetMethod(methodname).MakeGenericMethod(typeof(T), memberProp.PropertyType);
    22 
    23             return (IOrderedQueryable<T>)method.Invoke(null, new object[] { query, memberProp });
    24         }
    25 
    26         public static IOrderedQueryable<T> OrderByInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty)
    27         {
    28             return query.OrderBy(_GetLamba<T, TProp>(memberProperty));
    29         }
    30 
    31         public static IOrderedQueryable<T> OrderByDescendingInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty)
    32         {
    33             return query.OrderByDescending(_GetLamba<T, TProp>(memberProperty));
    34         }
    35 
    36         static Expression<Func<T, TProp>> _GetLamba<T, TProp>(PropertyInfo memberProperty)
    37         {
    38             if (memberProperty.PropertyType != typeof(TProp)) throw new Exception();
    39 
    40             var thisArg = Expression.Parameter(typeof(T));
    41             var lamba = Expression.Lambda<Func<T, TProp>>(Expression.Property(thisArg, memberProperty), thisArg);
    42 
    43             return lamba;
    44         }
    45 
    46 
    47         #endregion
    48     }
    orderby 扩展

     --------------------最后分页方法的实现--------------------------------

     1     /// <summary>
     2     /// list 分页
     3     /// </summary>
     4    public static class PaginationHelpr
     5     {
     6         public static List<T> Pagination<T>(this List<T> source, int start, int size) 
     7         {
     8             return source.Skip(start).Take(size);
     9         }
    10         public static List<T> Pagination<T>(this List<T> source,int start,int size,string sort,bool isDesc =false)where T:class
    11         {
    12             if (string.IsNullOrWhiteSpace(sort))
    13             {
    14                 return source.Skip(start).Take(size);
    15             }
    16             else {
    17                 return source.OrderBy(sort, isDesc).Skip(start).Take(size);
    18             } 
    19         }
    20     }
    list 分页

    -------------------测试一下代码-------------------------------------------

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             var list = new List<person>();
     6 
     7             for(int i=0;i<5000;i++) {
     8                 list.Add(new person() { age = i, id = i, name="jon" });
     9             }
    10 
    11             var datas = list.Pagination(1,20,"id",true);
    12             foreach (var i in datas)
    13             {
    14                 Console.WriteLine($"{i.id}");
    15             }
    16 
    17             Console.Read();
    18         }
    19     }
    20     public class person {
    21         public int id  {get;set;}
    22 
    23         public string name { get; set; }
    24 
    25         public int age { get; set; }
    26     }
    MainTest

    2,SQL

     在存储过程中实现分页

    当然我需要为这个查询条件准备好,表名称,where条件,orderby排序,当然有心的同学还可以自己扩展上更多的骚操作,Groupby啊之类的拓展。但是谨防被SQL注入啊

    --------------------分页代码----------------------------------------------

     1 USE [V8_Materiel]
     2 GO
     3 
     4 /****** Object:  StoredProcedure [dbo].[proc_pageList]    Script Date: 2017/6/24 9:52:07 ******/
     5 SET ANSI_NULLS ON
     6 GO
     7 
     8 SET QUOTED_IDENTIFIER ON
     9 GO
    10 
    11 ALTER PROCEDURE [dbo].[proc_pageList]
    12 (
    13 @tableName NVARCHAR(500),
    14 @where NVARCHAR(MAX),
    15 @orderBy NVARCHAR(200),
    16 @pageIndex INT,--页索引
    17 @pageSize INT--每页显示数
    18 )
    19 AS 
    20 BEGIN 
    21 SET  NOCOUNT  ON ;
    22 BEGIN TRY 
    23 DECLARE @sql nvarchar(1000)
    24 
    25 SELECT  @sql='SELECT * INTO #tempTable_0 FROM  '+@tableName+' WHERE  1=1 AND ';
    26 
    27 IF ISNULL(@where,'')<>''
    28 BEGIN
    29 SELECT @sql =@sql + @where
    30 END
    31 ELSE
    32 BEGIN
    33 SELECT @sql =@sql +'1=1'
    34 END  
    35 
    36 IF ISNULL(@orderBy,'')=''
    37 BEGIN
    38 SELECT @orderBy = 'id' 
    39 END
    40  
    41 SELECT @sql =@sql+'
    42 
    43 SELECT  * FROM
    44 (
    45 SELECT ROW_NUMBER() OVER (ORDER BY @orderBy ) AS rowNum,t.*  FROM #tempTable_0 t
    46 ) t
    47 WHERE t.rowNum between ((@pageIndex-1)*@pageSize)  AND ((@pageIndex-1)*@pageSize) +@pageSize
    48  
    49 SELECT COUNT(*) recordCount FROM #tempTable_0
    50 
    51 ';
    52 PRINT @sql
    53 EXECUTE sp_executesql @sql,
    54 @parm =N'
    55 @orderBy NVARCHAR(200),
    56 @pageIndex INT,
    57 @pageSize INT',
    58 @orderBy=@orderBy,
    59 @pageIndex=@pageIndex,
    60 @pageSize=@pageSize
    61 
    62 
    63 END TRY
    64 BEGIN CATCH
    65 
    66 SELECT ERROR_NUMBER() AS error_number ,
    67 ERROR_MESSAGE() AS error_message,
    68 ERROR_STATE() AS error_state,
    69 ERROR_SEVERITY() AS error_severity
    70 END CATCH
    71 
    72 SET  NOCOUNT  OFF ;
    73 END 
    74 GO
    存储过程分页

    ----------------- 存储过程的使用----

     1 USE [xxx]
     2 GO
     3 
     4 DECLARE    @return_value int
     5 
     6 EXEC    @return_value = [dbo].[proc_pageList]
     7         @tableName = N'T_Apply',
     8         @where = N'Code=''MSQ1612140006''',
     9         @orderBy = NULL,
    10         @pageIndex = 1,
    11         @pageSize = 100
    12 
    13 SELECT    'Return Value' = @return_value
    14 
    15 GO
    字符型where

    -------------------------------------------------------------------------------------------------------------------------

     1 USE [xxx]
     2 GO
     3 
     4 DECLARE    @return_value int
     5 
     6 EXEC    @return_value = [dbo].[proc_pageList]
     7         @tableName = N'T_Apply',
     8         @where = N'id>5',
     9         @orderBy = NULL,
    10         @pageIndex = 1,
    11         @pageSize = 100
    12 
    13 SELECT    'Return Value' = @return_value
    14 
    15 GO
    整数型where

     

    -----------------------------------

    总结就到这里了~~~~

    EXP int identity primary
  • 相关阅读:
    组件库设计
    kill 3000
    nextjs服务端渲染原理
    Web交互增强
    webpack4.0打包的时候一些技巧
    把网站部署到阿里云上的步骤
    typescript使用小结
    webpack 4.0尝鲜
    基于Quick-cocos2d-x的资源更新方案 二
    Android APK是否需要预解压
  • 原文地址:https://www.cnblogs.com/Hal-tan/p/7050504.html
Copyright © 2011-2022 走看看