你的位置:首页 > 软件开发 > 数据库 > MongoDB学习笔记~为IMongoRepository接口更新指定字段

MongoDB学习笔记~为IMongoRepository接口更新指定字段

发布时间:2015-05-01 02:01:12
回到目录对于MongoDB来说,它的更新建议是对指定字段来说的,即不是把对象里的所有字段都进行update,而是按需去更新,这在性能上是最优的,这当然也是非常容易理解的,我们今天要实现的就是这种按需去更新,并且,我还是不希望将MongoDB的内核暴露出去,这时,我想到了EF时候的 ...

回到目录

对于MongoDB.aspx' target='_blank'>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)));    }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:MongoDB学习笔记~为IMongoRepository接口更新指定字段

关键词:MongoDB

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录