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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

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仓储吧!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动,如需转载请自行联系原博主。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
6月前
|
NoSQL MongoDB Python
深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析
使用 sort() 方法对结果进行升序或降序排序。 sort() 方法接受一个参数用于“字段名”,一个参数用于“方向”(升序是默认方向)。
109 0
|
NoSQL MongoDB 数据库
mongodb官方提供的卸载流程
很简单的卸载流程,快速高效
393 0
|
29天前
|
NoSQL Java MongoDB
MongoDB 排序
10月更文挑战第16天
24 4
|
5月前
|
NoSQL MongoDB 数据库
MongoDB排序操作解析:优化性能,精准控制数据展示
MongoDB排序操作解析:优化性能,精准控制数据展示
|
6月前
|
人工智能 NoSQL atlas
MongoDB白皮书|应用程序驱动型智能:定义下一代成功的现代应用程序
MongoDB Atlas 开发者数据平台旨在帮助这两个团队“乘风破浪”,从而打造更快、更智能的应用和自动化业务流程,能够更快地对快速变化的操作数据做出反应和响应。
3230 0
|
6月前
|
NoSQL MongoDB
使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询
使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询
|
NoSQL MongoDB
MongoDB 排序
MongoDB 排序
79 0
|
11月前
|
人工智能 NoSQL atlas
MongoDB推出四项AI驱动的新功能,助力开发者提升效率并加速应用程序现代化
生成式人工智能让开发者有机会构建更好的应用程序。通过自动执行重复性任务,由AI驱动的工具和功能可以帮助开发者节省大量时间和精力,同时更快地交付更高质量的应用程序
MongoDB推出四项AI驱动的新功能,助力开发者提升效率并加速应用程序现代化
|
11月前
|
NoSQL 数据处理 MongoDB
MongoDB与阿里云携手驱动WeLab汇立集团引领超千万用户迈向智能金融未来
阿里云数据库MongoDB版无论从数据特点还是技术要求方面,都完美地匹配了WeLab的需求
MongoDB与阿里云携手驱动WeLab汇立集团引领超千万用户迈向智能金融未来