1. 程式人生 > >MongoDB學習筆記~以匿名物件做為查詢引數,方便查詢子物件

MongoDB學習筆記~以匿名物件做為查詢引數,方便查詢子物件

回到目錄

對於MongoDB的封裝還在繼續,對於不斷追求簡單的程式設計還在繼續,對於喜歡程式碼的那麼感覺,還在繼續...

當你的mongo資料表裡有子物件時,尤其是列表物件時,使用官方的驅動很是不爽,要記得很多新的物件型別,麻煩,所以,將它進行封裝,讓GetModel支援匿名引數!

表結構可能是這樣

希望查詢的語句變成這樣

看了上面的語句感覺挺酷吧,呵呵,下面看一下實現的程式碼,今天下午寫的,呵呵!

  public IEnumerable<TEntity> GetModel<U>(U template)
        {
            
return _table.Find(GeneratorMongoQuery(template)).ToListAsync().Result; } public PagedResult<TEntity> GetModel<U>(int pageIndex, int pageSize) { return this.GetModel(new { }, pageIndex, pageSize); } public PagedResult<TEntity> GetModel<U>(U template, int
pageIndex, int pageSize) { return this.GetModel(template, new { }, pageIndex, pageSize); } public PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize) { #region 條件過濾 BsonDocumentFilterDefinition
<TEntity> filterDefinition = GeneratorMongoQuery(template); #endregion #region 排序處理 SortDefinition<TEntity> sorts = new ObjectSortDefinition<TEntity>(new { }); foreach (var item in typeof(O).GetProperties()) { if ((OrderType)item.GetValue(orderby) == OrderType.Asc) sorts = sorts.Ascending(item.Name); else sorts = sorts.Descending(item.Name); } #endregion #region 分頁處理 var skip = (pageIndex - 1) * pageSize; var recordCount = _table.Find(filterDefinition).CountAsync(new CancellationToken()).Result; var limit = pageSize; return new PagedResult<TEntity>( recordCount, (int)(recordCount + pageSize - 1) / pageSize, pageSize, pageIndex, _table.Find(filterDefinition) .Sort(sorts) .Skip(skip) .Limit(limit) .ToListAsync().Result); #endregion }

提出了一個條件過濾的私有方法,因為它的邏輯在兩個方法裡都用了,所以進行提取

   /// <summary>
        /// 構建Mongo的查詢表示式,通過一個匿名物件
        /// </summary>
        /// <typeparam name="U"></typeparam>
        /// <param name="template"></param>
        /// <returns></returns>
        private BsonDocumentFilterDefinition<TEntity> GeneratorMongoQuery<U>(U template)
        {
            var qType = typeof(U);
            var outter = new BsonDocument();
            var simpleQuery = new BsonDocument();
            foreach (var item in qType.GetProperties())
            {
                if (item.PropertyType.IsClass && item.PropertyType != typeof(string))
                {
                    //複雜型別,導航屬性,類物件和集合物件 
                    foreach (var sub in item.PropertyType.GetProperties())
                    {
                        simpleQuery.Add(new BsonElement(item.Name + "." + sub.Name,
                           BsonValue.Create(sub.GetValue(item.GetValue(template)))
                            ));
                    }
                }
                else
                {
                    //簡單型別,ValueType和string
                    simpleQuery.Add(new BsonElement(item.Name,
                      BsonValue.Create(item.GetValue(template))
                        ));
                }
            }
            return new BsonDocumentFilterDefinition<TEntity>(simpleQuery);
        }

結果就是我們想好的,怎麼樣,用法挺友好吧

回到目錄