在网站开发中进行分页数据查询

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

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

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

 

 

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

 

总结就到这里了~~~~

posted on 2017-06-24 10:15  Hal-tan  阅读(258)  评论(1编辑  收藏  举报