打了很多字然后浏览器崩了,没保存,心态大崩。。。
-------------------------------正文开始分界线--------------------------------
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 }
--------------------对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 }
--------------------最后分页方法的实现--------------------------------

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 }
-------------------测试一下代码-------------------------------------------

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 }
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
-------------------------------------------------------------------------------------------------------------------------

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
-----------------------------------
总结就到这里了~~~~