1. 程式人生 > >MongoDB學習筆記~為IMongoRepository介面添加了排序和表示式樹,針對官方驅動

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

回到目錄