Lind.DDD.Repositories.Mongo层介绍

回到目录

之前已经发生了

大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoSql,它的使用场景是其它nosql所不能及的,这点是毋庸置疑的!

下面是大叔总结的Mongodb文章目录,选自<大叔Mongodb系列>

MongoDB学习笔记~环境搭建 (2015-03-30 10:34)

MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00)

MongoDB学习笔记~ObjectId主键的设计 (2015-04-09 13:08)

MongoDB学习笔记~客户端命令行的使用 (2015-04-10 13:40)

MongoDB学习笔记~索引提高查询效率 (2015-04-10 15:35)

MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法 (2015-04-11 22:13)

MongoDB学习笔记~Mongo集群和副本集 (2015-04-17 16:25)

MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动 (2015-04-27 22:11)

MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动 (2015-04-29 22:36)

MongoDB学习笔记~为IMongoRepository接口更新指定字段(2015-04-30 22:22)

MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事

MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象

MongoDB学习笔记~Update方法更新集合属性后的怪问题

MongoDB学习笔记~批量插入方法的实现

MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

MongoDB学习笔记~自己封装的Curd操作(按需更新的先决条件)

MongoDB学习笔记~MongoDB实体中的值对象

MongoDB学习笔记~大叔框架实体更新支持N层嵌套~递归递归我爱你!

MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除

MongoDB学习笔记~MongoVUE对数据进行查询,排序和按需显示

MongoDB学习笔记~管道中的分组实现group+distinct

MongoDB学习笔记~官方驱动的原生Curd操作

MongoDB学习笔记~官方驱动嵌套数组对象的更新

MongoDB学习笔记~使用原生语句实现三层集合关系的更新

MongoDB学习笔记~数据结构与实体对象不一致时,它会怎么样?

Lind.DDD里的仓储模块,Mongodb有一席之地

大叔的Mongodb仓储结构

大叔在设计mongodb查询和更新时,使用到了递归

  /// <summary>
        /// 按需要更新的构建者
        /// 递归构建Update操作串
        /// </summary>
        /// <param name="fieldList"></param>
        /// <param name="property"></param>
        /// <param name="propertyValue"></param>
        /// <param name="item"></param>
        /// <param name="fatherValue"></param>
        /// <param name="father"></param>
        private void GenerateRecursionExpress(
          List<UpdateDefinition<TEntity>> fieldList,
          PropertyInfo property,
          object propertyValue,
          TEntity item,
          object fatherValue,
          string father)
        {
            //复杂类型
            if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && propertyValue != null)
            {
                //集合
                if (typeof(IList).IsAssignableFrom(propertyValue.GetType()))
                {
                    var modifyIndex = 0;//要更新的记录索引
                    foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {
                        if (sub.PropertyType.IsClass && sub.PropertyType != typeof(string))
                        {
                            var arr = propertyValue as IList;
                            if (arr != null && arr.Count > 0)
                            {

                                var oldValue = property.GetValue(fatherValue ?? item) as IList;
                                if (oldValue != null)
                                {
                                    for (int index = 0; index < arr.Count; index++)
                                    {
                                        for (modifyIndex = 0; modifyIndex < oldValue.Count; modifyIndex++)
                                            if (sub.PropertyType.GetProperty(EntityKey).GetValue(oldValue[modifyIndex]).ToString()
                                                == sub.PropertyType.GetProperty(EntityKey).GetValue(arr[index]).ToString())//比较_id是否相等
                                                break;
                                        foreach (var subInner in sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                                        {
                                            if (string.IsNullOrWhiteSpace(father))
                                                GenerateRecursionExpress(fieldList, subInner, subInner.GetValue(arr[index]), item, arr[index], property.Name + "." + modifyIndex);
                                            else
                                                GenerateRecursionExpress(fieldList, subInner, subInner.GetValue(arr[index]), item, arr[index], father + "." + property.Name + "." + modifyIndex);
                                        }
                                    }
                                }

                            }
                        }
                    }
                }
                //实体
                else
                {
                    foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {

                        if (string.IsNullOrWhiteSpace(father))
                            GenerateRecursionExpress(fieldList, sub, sub.GetValue(propertyValue), item, property.GetValue(fatherValue), property.Name);
                        else
                            GenerateRecursionExpress(fieldList, sub, sub.GetValue(propertyValue), item, property.GetValue(fatherValue), father + "." + property.Name);
                    }
                }
            }
            //简单类型
            else
            {
                if (property.Name != EntityKey)//更新集中不能有实体键_id
                {
                    if (string.IsNullOrWhiteSpace(father))
                        fieldList.Add(Builders<TEntity>.Update.Set(property.Name, propertyValue));
                    else
                        fieldList.Add(Builders<TEntity>.Update.Set(father + "." + property.Name, propertyValue));
                }
            }
        }

让代码去改变我们的生活,改变我们的世界吧!

回到目录

时间: 2024-10-26 01:41:22

Lind.DDD.Repositories.Mongo层介绍的相关文章

Lind.DDD.Repositories.Redis层介绍

回到目录 之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席之地,作为当今最红的key/value存储机制,它在nosql的阵营中发挥着无可代替的作用! 下面是redis文章系列的目录,大家可以进行参考,看目录 Redis学习笔记~Redis在windows环境下的安装 Redis学习笔记~Redis在.net中的应用 Redis学习笔记~Redis提供的五

Lind.DDD.Repositories.EF层介绍

回到目录 Lind.DDD.Repositories.EF以下简称Repositories.EF,之所以把它从Lind.DDD中拿出来,完全出于可插拔的考虑,让大家都能休会到IoC的魅力,用到哪种方法持久化,就将那个DLL放到应用程序中,完全不需要把所有持久化方式耦合到一个项目里,这也是遵循了OCP的原则,对扩展是开放的,即你可以添加其它的持久化方式,在新的项目里:而不要在原有的项目中进行代码的修改. Repositories.EF做为数据持久化的一种方式,它直接继承了Lind.DDD.IRep

Lind.DDD.Events领域事件介绍

回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托,哪个是事件,搞的大家是糊里糊涂,进入C#2.0时代后,大叔也买了一本书,对于delegate和event这两个知识点看了至少有20几遍,感觉稍微有点明白了,明白了其中的真谛和用意. 委托:方法的规范,方法的模板,可以代表一类方法的集合 事件:委托的实例,事件在使用之前需要为它赋值,当然赋的就是一个

Lind.DDD.Paging分页模块介绍

回到目录 分页组件网上有很多,MVC.Pager,JSPager等,通过实现方式大体分为前端分页和后端分页,前端分页是前台对list内存本地集合进行分页,缺点就是在大数据情况下,内存占用过高:后端分页就是UI把要返回的页号告诉后台,由后台组织数据并返回,这种方法就是我们经常看到的了:而根据后台集合种类又可以分类List和IQueryable,前者是本地集合,在返回数据时,直接把第几页共几条的集合返回:IQueryable是预查询集合,它是Linq的产物,在很多地里它不通用,除非你的ORM框架支持

Lind.DDD.Authorization用户授权介绍

回到目录 Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统来说都是必要的,像管理型的页面都需要用户先去登陆,然后拿到凭证,才可以进行访问,这在MVC和WebApi体系结构里是很容易实现的,像过滤器里的AuthorizeAttribute和ActionFilterAttribute都可以实现用户授权的功能. AuthorizeAttribute和Action

Lind.DDD敏捷领域驱动框架~介绍

最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作<N_LayerAPP>这个项目,而在这几年的项目开发用,也尝到了这种职责分享框架的甜头,但在最近的开发中,也看到了其它框架的出现,如<ABP>项目,它主张简单框架,敏捷开发,在项目引用上将核心类库和持久层进行抽象分离,复用在各位领域项目之中,这在项目整个感觉上更加简单,也更容易被人们

Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就是大叔开发Lind.DDD框架的目的,让一切变得更简单... Lind.DDD层 主要是公用方法,组件,规约等,如日志组件(Logger),消息组件(Messaging),IOC,AOP,缓存(Caching),异常,请求/响应,用户授权(Authorization),安全校验,领域模型(Domai

Lind.DDD.ConfigConstants统一管理系统配置

仓储大叔好了相赠 网上2500元 跟谁学课堂 C#视频 ddd领域驱动架构设计视频 还赠送ABP视频两套 qq 2589406800 qq1399494644 qq2128543647 qq2890083872 qq3235634116 qq3381945576 qq2171713479源代码框架lind.ddd(后台管理系统,电商系统,API,SSO,xamarin,ko,各组件单元测试) 赠送ABP视频+lindCore源碼+LindAgility(敏捷框架) (60元) Lind.DDD.

Lind.DDD.Domain领域模型介绍

回到目录 Lind.DDD.Domain位于Lind.DDD核心项目中,它主要面向领域实体而设计,由一个IEntity的标识接口,EntityBase基类和N个Entity实体类组成,其中IEntity主要用来标识,在仓储操作时,用它来表明操作的实体范围和约束:EntityBase定义了几个公用的属性,为了避免代码的重复,特意将状态,插入时间和更新时间定义到了EntityBase里,而为何不将主键定义进来呢,主要考虑到主键的类型是为确实的,还有就是不同类型的主键可能需要实现不同的特性,如Mong