文章出處
文章列表
對于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); }
結果就是我們想好的,怎么樣,用法挺友好吧
文章列表
全站熱搜