(还是PDF.NET)能否给出一个综合的分页查询的示例

masterjian 2016-05-20 08:52:42
我这里写了一个,总感觉写的不合适(或者说只是功能实现了,但是还有优化的地方)
并且,获取总行数的地方,还必须得加入OrderBy字句?!
 // 需要查询用到的实体
BUser user = new BUser();

// 使用 OQLCompareFun 委托,完成查询条件的复用
OQLCompareFunc cmpFun = cmp =>
{
// 此处构造复杂的Where条件
OQLCompare cmpResult = cmp.Comparer(user.BUserID, OQLCompare.CompareType.GreaterThanOrEqual, 20)
& cmp.Comparer(user.BUserID, OQLCompare.CompareType.LessThanOrEqual, 40);
return cmpResult;
};

int maxCount =
Convert.ToInt32(EntityQueryAnonymous.ExecuteOQLCount(
OQL.From(user).Select().Where(cmpFun).OrderBy(user.BUserID,"ASC").END,
MyDB.GetDBHelper()
)
);

// 构造分页查询的对象
OQL qq = OQL.From(user)
.Select()
.Where(cmpFun)
.END
.Limit(5,2);
qq.PageWithAllRecordCount = maxCount;

// 以返回DataTable为例
DataTable dt = EntityQueryAnonymous.EntitysToDataTable(
EntityQuery<BUser>.QueryList(qq));
...全文
165 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
blueskyf 2016-05-20
  • 打赏
  • 举报
回复
获取记录总数还有个重载,用于传入不同AdoHelper实例的

/// <summary>
        /// 取得记录总数
        /// </summary>
        /// <param name="cp">where条件</param>
        /// <returns></returns>
        public static int GetRecordCounts<T>(OQLCompareFunc<T> cp,AdoHelper ado) where T : EntityBase, IIntID, new()
        {
            T m = new T();
            OQL q = new OQL(m);
            if ((object)cp != null)
            {
                q.Select().Count(m.ID, "Counts").Where(cp);
            }
            else
            {
                q.Select().Count(m.ID, "Counts");
            }

            T mCounts = EntityQuery<T>.QueryObject(q,ado);

            return Convert.ToInt32(mCounts.PropertyList("Counts"));

        }
blueskyf 2016-05-20
  • 打赏
  • 举报
回复
我自己写了个通用方法:

/// <summary>
        /// 取得记录总数
        /// </summary>
        /// <param name="cp">where条件</param>
        /// <returns></returns>
        public static int GetRecordCounts<T>(OQLCompare cp) where T : EntityBase, IIntID, new()
        {
            T m = new T();
            OQL q = new OQL(m);
            if ((object)cp != null)
            {
                q.Select().Count(m.ID, "Counts").Where(cp);
            }
            else
            {
                q.Select().Count(m.ID, "Counts");
            }

            T mCounts = EntityQuery<T>.QueryObject(q);

            return Convert.ToInt32(mCounts.PropertyList("Counts"));

        }
然后在需要的地方调用:

OQLCompareFunc<Entity.LT_Banner> fun = (cmp, u) =>
            {
                cmp = cmp.Comparer(u.IsDelete, "=", false);

                return cmp;
            };

            int total = BLL.CURD.GetRecordCounts<Entity.LT_Banner>(fun);
最后在获取列表处传人记录总数就行了:

List<Entity.LT_Banner> list = OQL.FromObject<Entity.LT_Banner>().Select().Where(fun).OrderBy((o, u) => o.Desc(u.ID)).Limit(pageSize, page, total).ToList();
刹那的菜鸟 2016-05-20
  • 打赏
  • 举报
回复
引用 2 楼 bluedoctor 的回复:
实际上,SOD还可以有更为简单的方式求取记录总数,但前提是分页需要加上排序,前面的例子修改如下:

 OQL qPage = OQL.From(user)
                .Select()
                 .Where(cmpFun)
                 .OrderBy(user.Name)
                .END;

qPage.Limit(10,100,true) ;//自动求取记录总数
var list=EntityQuery<User>.QueryList(qPage);
int allCount =qPage.PageWithAllRecordCount;
楼上正解, 而且关于分页查询的时候,也可以设置要查询的总记录数,很适合api接口传输
bluedoctor 2016-05-20
  • 打赏
  • 举报
回复
实际上,SOD还可以有更为简单的方式求取记录总数,但前提是分页需要加上排序,前面的例子修改如下:

 OQL qPage = OQL.From(user)
                .Select()
                 .Where(cmpFun)
                 .OrderBy(user.Name)
                .END;

qPage.Limit(10,100,true) ;//自动求取记录总数
var list=EntityQuery<User>.QueryList(qPage);
int allCount =qPage.PageWithAllRecordCount;
bluedoctor 2016-05-20
  • 打赏
  • 举报
回复
简单的做法,就是单独写一次Count查询,示例如下:

 OQL qq = OQL.From(user)
                .Select()
                .Count(user.ID,"")
                .Where(cmpFun)
                .END
var countUser=EntityQuery<User>.QueryObject(qq);
var count = countUser.ID;

然后,将这个记录数给你的OQL分页语句:

 OQL qPage = OQL.From(user)
                .Select()
                 .Where(cmpFun)
                .END;
qPage.PageWithAllRecordCount=count;
qPage.Limit(10,100);
var list=EntityQuery<User>.QueryList(qPage);

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧