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();
        }

通过上面代码我们可以看到,只是将需要更新的字段进行赋值即可!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:MongoDB学习笔记~为IMongoRepository接口更新指定字段,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章