MongoDB學習筆(bi)記~以匿名(ming)對(dui)象做為查(cha)詢(xun)參數(shu),方便查(cha)詢(xun)子對(dui)象
對于(yu)(yu)MongoDB的(de)封裝還(huan)在繼(ji)續(xu)(xu),對于(yu)(yu)不(bu)斷追求(qiu)簡單的(de)編程還(huan)在繼(ji)續(xu)(xu),對于(yu)(yu)喜歡代(dai)碼的(de)那么感覺(jue),還(huan)在繼(ji)續(xu)(xu)...
當你的mongo數據(ju)表里有子對(dui)象時(shi),尤其(qi)是(shi)列(lie)表對(dui)象時(shi),使用官方的驅動(dong)很是(shi)不爽,要(yao)記得很多新的對(dui)象類型(xing),麻煩(fan),所(suo)以(yi),將它進行封裝,讓GetModel支持匿名參數!
表結構可能是這樣
希望查詢的語(yu)句變成這樣(yang)
看(kan)了上面(mian)的語句感覺挺酷吧,呵呵,下(xia)面(mian)看(kan)一(yi)下(xia)實現的代碼,今天下(xia)午寫(xie)的,呵呵!
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 }
提(ti)(ti)出了一個條件過濾的私有(you)方法,因為(wei)它(ta)的邏輯在兩個方法里都用了,所(suo)以進行(xing)提(ti)(ti)取
/// <summary> /// 構建Mongo的查(cha)詢(xun)表達式,通過一個匿名對象 /// </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)) { //復雜類(lei)型,導航屬性(xing),類(lei)對象(xiang)和(he)集合對象(xiang) foreach (var sub in item.PropertyType.GetProperties()) { simpleQuery.Add(new BsonElement(item.Name + "." + sub.Name, BsonValue.Create(sub.GetValue(item.GetValue(template))) )); } } else { //簡單(dan)類型,ValueType和string simpleQuery.Add(new BsonElement(item.Name, BsonValue.Create(item.GetValue(template)) )); } } return new BsonDocumentFilterDefinition<TEntity>(simpleQuery); }
結果就是我們想好的(de),怎么(me)樣,用法挺友(you)好吧(ba)