天天看點

MongoDB學習筆記~為IMongoRepository接口添加了排序和表達式樹,針對官方驅動

回到目錄

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倉儲吧!

作者:倉儲大叔,張占嶺,

榮譽:微軟MVP

QQ:853066980

支付寶掃一掃,為大叔打賞!

MongoDB學習筆記~為IMongoRepository接口添加了排序和表達式樹,針對官方驅動