Lind.DDD.Repositories.Mongo層介紹

回到目錄html

以前已經發生了

大叔以前講過被倉儲化了的Mongodb,而在大叔開發了Lind.DDD以後,決定把這個東西再搬到本框架的倉儲層來,這也是大勢所趨的,畢竟mongodb是最像關係數據庫的NoSql,它的使用場景是其它nosql所不能及的,這點是毋庸置疑的!sql

下面是大叔總結的Mongodb文章目錄,選自<大叔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)nosql

MongoDB學習筆記~爲IMongoRepository接口添加分頁取集合的方法 (2015-04-11 22:13)post

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

讓代碼去改變咱們的生活,改變咱們的世界吧!

回到目錄

相關文章
相關標籤/搜索