您的位置:首页 > 其它

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: