MongoDB學(xué)習(xí)筆記~為IMongoRepository接口更新指定字段
對(duì)于MongoDB來(lái)說(shuō),它的更新建議是對(duì)指定字段來(lái)說(shuō)的,即不是把對(duì)象里的所有字段都進(jìn)行update,而是按需去更新,這在性能上是最優(yōu)的,這當(dāng)然也是非常容易理解的,我們今天要實(shí)現(xiàn)的就是這種按需去更新,并且,我還是不希望將MongoDB的內(nèi)核暴露出去,這時(shí),我想到了EF時(shí)候的按需要更新,即為實(shí)體哪些屬性賦值就更新哪些屬性;這個(gè)功能實(shí)際上使用了表達(dá)式樹,將你的屬性和屬性值存儲(chǔ)到Expression里,然后在update方法內(nèi)部再進(jìn)行解析即可,具體代碼如下
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)//更新集中不能有實(shí)體鍵_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))); }
其實(shí)在方法調(diào)用上也是非常容易的,我們來(lái)看這個(gè)例子
[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("", "請(qǐng)認(rèn)真填寫表單!"); return View(); }
通過(guò)上面代碼我們可以看到,只是將需要更新的字段進(jìn)行賦值即可!
浙公網(wǎng)安備 33010602011771號(hào)