1. 程式人生 > >MongoDB學習筆記~為IMongoRepository介面更新指定欄位

MongoDB學習筆記~為IMongoRepository介面更新指定欄位

回到目錄

對於MongoDB來說,它的更新建議是對指定欄位來說的,即不是把物件裡的所有欄位都進行update,而是按需去更新,這在效能上是最優的,這當然也是非常容易理解的,我們今天要實現的就是這種按需去更新,並且,我還是不希望將MongoDB的核心暴露出去,這時,我想到了EF時候的按需要更新,即為實體哪些屬性賦值就更新哪些屬性;這個功能實際上使用了表示式樹,將你的屬性和屬性值儲存到Expression裡,然後在update方法內部再進行解析即可,具體程式碼如下

        public void Update<T>(System.Linq.Expressions.Expression<Action<T>> entity) where
T : class { var query = new QueryDocument(); var fieldList = new List<UpdateDefinition<TEntity>>(); var param = entity.Body as MemberInitExpression; foreach (var item in param.Bindings) { string
propertyName = item.Member.Name; object propertyValue; var memberAssignment = item as MemberAssignment; if (memberAssignment.Expression.NodeType == ExpressionType.Constant) { propertyValue = (memberAssignment.Expression as
ConstantExpression).Value; } else { propertyValue = Expression.Lambda(memberAssignment.Expression, null).Compile().DynamicInvoke(); } if (propertyName != EntityKey)//更新集中不能有實體鍵_id { fieldList.Add(Builders<TEntity>.Update.Set(propertyName, propertyValue)); } else { query = new QueryDocument("_id",new ObjectId(propertyValue.ToString())); } } ForWait(() => _table.UpdateOneAsync(query, Builders<TEntity>.Update.Combine(fieldList))); }

其實在方法呼叫上也是非常容易的,我們來看這個例子

        [HttpPost]
        public ActionResult Edit(WebManageUsers entity)
        {
            if (ModelState.IsValid)
            {
                _webManageUsersRepository.Update<WebManageUsers>(i => new WebManageUsers
                {
                    Id = entity.Id,
                    LoginName = entity.LoginName
                });
                return RedirectToAction("Index");
            }
            ModelState.AddModelError("", "請認真填寫表單!");
            return View();
        }

通過上面程式碼我們可以看到,只是將需要更新的欄位進行賦值即可!

回到目錄