MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

回到目录

MongoDB的官方驱动,语法更好,更强

之前写过关于IMongoRepository仓储的文章,在mongodb的驱动选择上使用了NoRM,但是进行$ref引用类型导航时出现了问题,它对引用类型属性支持不是很好,还是使用几年前的泛型技术而没有使用Attribute,在这个方面官方驱动做的更好,所以,我还是使用官方驱动又实现了一次IMongoRepository,把一些实现的细节封装在了底层,我们叫这个官方仓储为MongoOfficialRepository,呵呵,谁叫你来的晚呢,MongoRepository已经为NoRM占上了,呵呵。

新的IMongoRepository接口内容添加了4个方法

复制代码
        /// <summary>
        /// 官方驱动,返回带分页的结果集
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        PagedResult<TEntity> GetModel(int pageIndex, int pageSize);

        /// <summary>
        /// 官方驱动,返回带条件和分页的结果集
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, int pageIndex, int pageSize);

        /// <summary>
        /// 官方驱动,返回带排序和分页的结果集
        /// </summary>
        /// <param name="fields"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        PagedResult<TEntity> GetModel(Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize);

        /// <summary>
        /// 官方驱动,返回带条件和排序及分页的结果集
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="fields"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize);
复制代码

对这四大方法的实现,为了不让MongoDB的更多细节公开,所以,更多的内核只能在仓储中实现了,呵呵

复制代码
        public PagedResult<TEntity> GetModel(int pageIndex, int pageSize)
        {
            return GetModel(i => true, pageIndex, pageSize);
        }

        public PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, int pageIndex, int pageSize)
        {
            return GetModel(expression, new Dictionary<Expression<Func<TEntity, object>>, bool>(), pageIndex, pageSize);
        }

        public PagedResult<TEntity> GetModel(
            Dictionary<Expression<Func<TEntity, object>>, bool> fields,
            int pageIndex,
            int pageSize)
        {
            return GetModel(i => true, fields, pageIndex, pageSize);
        }

        public PagedResult<TEntity> GetModel(
            Expression<Func<TEntity, bool>> expression,
            Dictionary<Expression<Func<TEntity, object>>, bool> fields,
            int pageIndex,
            int pageSize)
        {

            SortDefinition<TEntity> sorts = new ObjectSortDefinition<TEntity>(new { });
            foreach (var item in fields)
            {
                if (item.Value)
                    sorts = sorts.Ascending(item.Key);
                else
                    sorts = sorts.Descending(item.Key);
            }
            var skip = (pageIndex - 1) * pageSize;
            var limit = pageSize;
            var recordCount = _table.CountAsync<TEntity>(i => true).Result;
            return new PagedResult<TEntity>(
                recordCount,
                (int)(recordCount + pageSize - 1) / pageSize,
                pageSize,
                pageIndex,
                _table.Find(expression)
                      .Sort(sorts)
                      .Skip(skip)
                      .Limit(limit)
                      .ToListAsync().Result);
        }
复制代码

OK,现在你可以在业务层去调用它了,基本上面四个方法可以满足你的一切需求了,呵呵!

看下在UI层对它的调用,本DEMO没有BLL层,呵呵

复制代码
    public ActionResult Index(int? loginNameSort, int? realNameSort, int page = 1)
        {
            Dictionary<Expression<Func<WebManageUsers, object>>, bool> sortList = 
new System.Collections.Generic.Dictionary<Expression<Func<WebManageUsers, object>>, bool>(); if (loginNameSort.HasValue) sortList.Add(i => i.LoginName, loginNameSort.Value == 0); if (realNameSort.HasValue) sortList.Add(i => i.RealName, realNameSort.Value == 0); var model = _webManageUsersRepository.GetModel(sortList, page, 10); return View(model); }
复制代码

 

 

怎么样,看了上面代码是否心里痒痒了,哈哈,赶快去开发你自己的MongoDB仓储吧!

回到目录

posted @   张占岭  阅读(6415)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2012-04-27 架构,改善程序复用性的设计~第一讲 系统的复用性离不开系统的面向对象性
2012-04-27 Linq实体类的设计(解决了复合查询的问题,同时解决了LINQ上下文缓存问题)
点击右上角即可分享
微信分享提示