Linq通用分页数据查询方法
2013-01-19 13:51
483 查看
在使用EF的过程有很多需要分页查询数据的地方,但是经常重复在输入分页的相关代码,这样即不便于维护,也增加了不少工作量。
对于通用查询有几个要点,一是要动态定义查询条件,还可以动态选择所需要的列。
1、数据查询方法
Code Snippet
publicstaticList<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Expression<Func<TEntity, int, TResult>> selector,
bool isAsc)
Code Snippet
publicstaticList<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
Code Snippet
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
3、分页查询方法
Code Snippet
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector, bool isAsc)
Code Snippet
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector, bool isAsc)
Code Snippet
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector,
bool isAsc)
工具类方法:
Code Snippet
publicclassPageInfo
{
publicstaticvoid CheckPageIndexAndSize(refint index, refint size)
{
if (index < 1)
{
index = 1;
}
if (size < 1)
{
size = 20;
}
}
publicstaticvoid CheckPageIndexAndSize(refint index, int size, int count)
{
if (count >= index * size)
{
return;
}
index = count / size;
if (count % size > 0)
{
index++;
}
if (index == 0)
{
index = 1;
}
}
}
publicclassPageInfo<T> : PageInfo
{
internal PageInfo()
{
DataList = newList<T>();
}
public PageInfo(int index, int pageSize, int count, List<T> dataList)
{
Index = index;
PageSie = pageSize;
Count = count;
DataList = dataList;
}
publicint Index { get; privateset; }
publicint PageSie { get; privateset; }
publicint Count { get; privateset; }
publicList<T> DataList { get; privateset; }
publicPageInfo<T> Empty
{
get { returnnewPageInfo<T>(); }
}
}
实现代码:
Code Snippet
publicstaticclassLinqExtent
{
publicstaticList<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Expression<Func<TEntity, int, TResult>> selector,
bool isAsc)
{
if (selector == null)
{
thrownewArgumentNullException("selector");
}
var queryable = query;
if (where != null)
{
queryable = queryable.Where(where);
}
if (orderby != null)
{
queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
}
return queryable.Select(selector).ToList();
}
publicstaticList<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
{
if (selector == null)
{
thrownewArgumentNullException("selector");
}
var queryable = query;
if (where != null)
{
queryable = queryable.Where(where);
}
if (orderby != null)
{
queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
}
return selector(queryable);
}
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
{
return Query(query, index, pageSize, newList<Expression<Func<TEntity, bool>>> {where}, orderby, selector,
isAsc);
}
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector, bool isAsc)
{
//if (selector == null)
//{
// throw new ArgumentNullException("selector");
//}
//PageInfo.CheckPageIndexAndSize(ref index,ref pageSize);
//IQueryable<TEntity> queryable = query;
//if (wheres != null)
//{
// wheres.ForEach(p=>queryable = queryable.Where(p));
//}
//int count = query.Count();
//PageInfo.CheckPageIndexAndSize(ref index,pageSize,count);
//if (count > 0)
//{
// if (orderby != null)
// {
// queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
// }
// return new PageInfo<object>(index,pageSize,count,selector(queryable));
//}
//return new PageInfo<object>(index,pageSize,count,new List<object>());
return Query<TEntity, TOrderBy, object>(query, index, pageSize, wheres, orderby, selector, isAsc);
}
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector, bool isAsc)
{
if (selector == null)
{
thrownewArgumentNullException("selector");
}
PageInfo.CheckPageIndexAndSize(ref index, ref pageSize);
IQueryable<TEntity> queryable = query;
if (wheres != null)
{
wheres.ForEach(p => queryable = queryable.Where(p));
}
int count = query.Count();
PageInfo.CheckPageIndexAndSize(ref index, pageSize, count);
if (count > 0)
{
if (orderby != null)
{
queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
}
returnnewPageInfo<TResult>(index, pageSize, count, selector(queryable));
}
returnnewPageInfo<TResult>(index, pageSize, count, newList<TResult>());
}
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector,
bool isAsc)
{
return Query(query, index, pageSize, newList<Expression<Func<TEntity, bool>>> { where }, orderby, selector,
isAsc);
}
}
对于通用查询有几个要点,一是要动态定义查询条件,还可以动态选择所需要的列。
1、数据查询方法
Code Snippet
publicstaticList<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Expression<Func<TEntity, int, TResult>> selector,
bool isAsc)
Code Snippet
publicstaticList<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
Code Snippet
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
3、分页查询方法
Code Snippet
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector, bool isAsc)
Code Snippet
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector, bool isAsc)
Code Snippet
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector,
bool isAsc)
工具类方法:
Code Snippet
publicclassPageInfo
{
publicstaticvoid CheckPageIndexAndSize(refint index, refint size)
{
if (index < 1)
{
index = 1;
}
if (size < 1)
{
size = 20;
}
}
publicstaticvoid CheckPageIndexAndSize(refint index, int size, int count)
{
if (count >= index * size)
{
return;
}
index = count / size;
if (count % size > 0)
{
index++;
}
if (index == 0)
{
index = 1;
}
}
}
publicclassPageInfo<T> : PageInfo
{
internal PageInfo()
{
DataList = newList<T>();
}
public PageInfo(int index, int pageSize, int count, List<T> dataList)
{
Index = index;
PageSie = pageSize;
Count = count;
DataList = dataList;
}
publicint Index { get; privateset; }
publicint PageSie { get; privateset; }
publicint Count { get; privateset; }
publicList<T> DataList { get; privateset; }
publicPageInfo<T> Empty
{
get { returnnewPageInfo<T>(); }
}
}
实现代码:
Code Snippet
publicstaticclassLinqExtent
{
publicstaticList<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Expression<Func<TEntity, int, TResult>> selector,
bool isAsc)
{
if (selector == null)
{
thrownewArgumentNullException("selector");
}
var queryable = query;
if (where != null)
{
queryable = queryable.Where(where);
}
if (orderby != null)
{
queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
}
return queryable.Select(selector).ToList();
}
publicstaticList<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
{
if (selector == null)
{
thrownewArgumentNullException("selector");
}
var queryable = query;
if (where != null)
{
queryable = queryable.Where(where);
}
if (orderby != null)
{
queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
}
return selector(queryable);
}
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector,
bool isAsc)
{
return Query(query, index, pageSize, newList<Expression<Func<TEntity, bool>>> {where}, orderby, selector,
isAsc);
}
publicstaticPageInfo<object> Query<TEntity, TOrderBy>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<object>> selector, bool isAsc)
{
//if (selector == null)
//{
// throw new ArgumentNullException("selector");
//}
//PageInfo.CheckPageIndexAndSize(ref index,ref pageSize);
//IQueryable<TEntity> queryable = query;
//if (wheres != null)
//{
// wheres.ForEach(p=>queryable = queryable.Where(p));
//}
//int count = query.Count();
//PageInfo.CheckPageIndexAndSize(ref index,pageSize,count);
//if (count > 0)
//{
// if (orderby != null)
// {
// queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
// }
// return new PageInfo<object>(index,pageSize,count,selector(queryable));
//}
//return new PageInfo<object>(index,pageSize,count,new List<object>());
return Query<TEntity, TOrderBy, object>(query, index, pageSize, wheres, orderby, selector, isAsc);
}
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
List<Expression<Func<TEntity, bool>>> wheres,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector, bool isAsc)
{
if (selector == null)
{
thrownewArgumentNullException("selector");
}
PageInfo.CheckPageIndexAndSize(ref index, ref pageSize);
IQueryable<TEntity> queryable = query;
if (wheres != null)
{
wheres.ForEach(p => queryable = queryable.Where(p));
}
int count = query.Count();
PageInfo.CheckPageIndexAndSize(ref index, pageSize, count);
if (count > 0)
{
if (orderby != null)
{
queryable = isAsc ? queryable.OrderBy(orderby) : queryable.OrderByDescending(orderby);
}
returnnewPageInfo<TResult>(index, pageSize, count, selector(queryable));
}
returnnewPageInfo<TResult>(index, pageSize, count, newList<TResult>());
}
publicstaticPageInfo<TResult> Query<TEntity, TOrderBy, TResult>(thisIQueryable<TEntity> query, int index, int pageSize,
Expression<Func<TEntity, bool>> where,
Expression<Func<TEntity, TOrderBy>> orderby,
Func<IQueryable<TEntity>, List<TResult>> selector,
bool isAsc)
{
return Query(query, index, pageSize, newList<Expression<Func<TEntity, bool>>> { where }, orderby, selector,
isAsc);
}
}
相关文章推荐
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
- 利用存储过程实现交叉表格式数据查询的一种通用方法
- LINQ通用分页绑定方法的实现
- 6、实现通用分页功能二(实现通用分页查询的业务方法)
- 海量数据库的查询优化及分页算法方案(二)-实现小数据量和海量数据的通用分页显示存储过程 [转]
- NHibernate分页获取,通用条件查询方法
- Linq 之 分页查询数据
- C#.NET 通用权限管理系统组件 大数据多表分页获取部分列的参考方法
- 非常简单的实现LINQ通用分页绑定方法
- JDBC_利用反射及JDBC元数据编写通用的查询方法
- LINQ-分页数据查询
- 利用反射及JDBC元数据编写通用查询方法
- Linq 分页查询数据
- C#.NET 通用权限管理系统组件 大数据多表分页获取部分列的参考方法
- SQL分页存储过程和C#中linq分页查询方法
- SQL数据分页查询的方法
- MVC中使用Linq To Sql进行数据查询及分页
- LINQ--联合查询表,按记录数分页读取数据
- Linq查询绑定给GridView,提示 数据源不支持服务器端的数据分页.
- 使用Criteria进行分页查询通用方法提取