文章出處
文章列表
MongoDB的官方驅動,語法更好,更強
之前寫過關于IMongoRepository倉儲的文章,在mongodb的驅動選擇上使用了NoRM,但是進行$ref引用類型導航時出現了問題,它對引用類型屬性支持不是很好,還是使用幾年前的泛型技術而沒有使用Attribute,在這個方面官方驅動做的更好,所以,我還是使用官方驅動又實現了一次IMongoRepository,把一些實現的細節封裝在了底層,我們叫這個官方倉儲為MongoOfficialRepository,呵呵,誰叫你來的晚呢,MongoRepository已經為NoRM占上了,呵呵。
新的IMongoRepository接口內容添加了4個方法
/// <summary> /// 官方驅動,返回帶分頁的結果集 /// </summary> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(int pageIndex, int pageSize); /// <summary> /// 官方驅動,返回帶條件和分頁的結果集 /// </summary> /// <param name="expression"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, int pageIndex, int pageSize); /// <summary> /// 官方驅動,返回帶排序和分頁的結果集 /// </summary> /// <param name="fields"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize); /// <summary> /// 官方驅動,返回帶條件和排序及分頁的結果集 /// </summary> /// <param name="expression"></param> /// <param name="fields"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize);
對這四大方法的實現,為了不讓MongoDB的更多細節公開,所以,更多的內核只能在倉儲中實現了,呵呵
public PagedResult<TEntity> GetModel(int pageIndex, int pageSize) { return GetModel(i => true, pageIndex, pageSize); } public PagedResult<TEntity> GetModel(Expression<Func<TEntity, bool>> expression, int pageIndex, int pageSize) { return GetModel(expression, new Dictionary<Expression<Func<TEntity, object>>, bool>(), pageIndex, pageSize); } public PagedResult<TEntity> GetModel( Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize) { return GetModel(i => true, fields, pageIndex, pageSize); } public PagedResult<TEntity> GetModel( Expression<Func<TEntity, bool>> expression, Dictionary<Expression<Func<TEntity, object>>, bool> fields, int pageIndex, int pageSize) { SortDefinition<TEntity> sorts = new ObjectSortDefinition<TEntity>(new { }); foreach (var item in fields) { if (item.Value) sorts = sorts.Ascending(item.Key); else sorts = sorts.Descending(item.Key); } var skip = (pageIndex - 1) * pageSize; var limit = pageSize; var recordCount = _table.CountAsync<TEntity>(i => true).Result; return new PagedResult<TEntity>( recordCount, (int)(recordCount + pageSize - 1) / pageSize, pageSize, pageIndex, _table.Find(expression) .Sort(sorts) .Skip(skip) .Limit(limit) .ToListAsync().Result); }
OK,現在你可以在業務層去調用它了,基本上面四個方法可以滿足你的一切需求了,呵呵!
看下在UI層對它的調用,本DEMO沒有BLL層,呵呵
public ActionResult Index(int? loginNameSort, int? realNameSort, int page = 1) { Dictionary<Expression<Func<WebManageUsers, object>>, bool> sortList =
new System.Collections.Generic.Dictionary<Expression<Func<WebManageUsers, object>>, bool>(); if (loginNameSort.HasValue) sortList.Add(i => i.LoginName, loginNameSort.Value == 0); if (realNameSort.HasValue) sortList.Add(i => i.RealName, realNameSort.Value == 0); var model = _webManageUsersRepository.GetModel(sortList, page, 10); return View(model); }
怎么樣,看了上面代碼是否心里癢癢了,哈哈,趕快去開發你自己的MongoDB倉儲吧!
文章列表
全站熱搜