vs网站开发效果图,网站与域名,十大免费货源网站免费版本,南县网站建设在实际更新Mongo对象时发现#xff0c;原有的更新代码无法更新复杂的数据类型对象。恰好看到张占岭老师有对该方法做相关的改进#xff0c;因此全抄了下来。 总的核心思想就是运用反射与递归#xff0c;对对象属性一层一层挖掘下去#xff0c;循环创建父类及之类的更新表达…在实际更新Mongo对象时发现原有的更新代码无法更新复杂的数据类型对象。恰好看到张占岭老师有对该方法做相关的改进因此全抄了下来。 总的核心思想就是运用反射与递归对对象属性一层一层挖掘下去循环创建父类及之类的更新表达式。 相关代码如下 #region 递归获取字段更新表达式private ListUpdateDefinitionT GetUpdateDefinitionsT(T entity)
{var type typeof(T);var fieldList new ListUpdateDefinitionT();foreach (var property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public)){GenerateRecursionT(fieldList, property, property.GetValue(entity), entity, );}return fieldList;
}private void GenerateRecursionTEntity(ListUpdateDefinitionTEntity fieldList,PropertyInfo property,object propertyValue,TEntity item,string father)
{//复杂类型if (property.PropertyType.IsClass property.PropertyType ! typeof(string) propertyValue ! null){//集合if (typeof(IList).IsAssignableFrom(propertyValue.GetType())){foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)){if (sub.PropertyType.IsClass sub.PropertyType ! typeof(string)){var arr propertyValue as IList;if (arr ! null arr.Count 0){for (int index 0; index arr.Count; index){foreach (var subInner in sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)){if (string.IsNullOrWhiteSpace(father))GenerateRecursion(fieldList, subInner, subInner.GetValue(arr[index]), item, property.Name . index);elseGenerateRecursion(fieldList, subInner, subInner.GetValue(arr[index]), item, father . property.Name . index);}}}}}}//实体else{foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)){if (string.IsNullOrWhiteSpace(father))GenerateRecursion(fieldList, sub, sub.GetValue(propertyValue), item, property.Name);elseGenerateRecursion(fieldList, sub, sub.GetValue(propertyValue), item, father . property.Name);}}}//简单类型else{if (property.Name ! _id)//更新集中不能有实体键_id{if (string.IsNullOrWhiteSpace(father))fieldList.Add(BuildersTEntity.Update.Set(property.Name, propertyValue));elsefieldList.Add(BuildersTEntity.Update.Set(father . property.Name, propertyValue));}}
}/// summary
/// 构建Mongo的更新表达式
/// /summary
/// param nameentity/param
/// returns/returns
private ListUpdateDefinitionT GeneratorMongoUpdateT(T item)
{var fieldList new ListUpdateDefinitionT();foreach (var property in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public)){GenerateRecursionT(fieldList, property, property.GetValue(item), item, string.Empty);}return fieldList;
}#endregion View Code 在实际应用过程中有几点要注意一下 1.在对象创建时就要将对象中的数组属性初始化否则在更新时无法插入子项。 public class Users : MongoObj
{public Users() {Subs new ListSub();Spell new Listint();}public string ObjectId_id { get; set; }public string Name { get; set; }public string Sex { set; get; }public Listint Spell { get; set; }public ListSub Subs { get; set; }
} 2.如果数组是一个复杂对象数据那么要给对象添加一个_id,并且在对象初始化时就给_id赋值。 public class Sub
{public Sub() { _id MongoDB.Bson.ObjectId.GenerateNewId().ToString();}public string _id { get; set; }public string aa {get;set;}public string bb{get;set;}
} 3.实际使用的时候发现无法对数组的子项做删除。 比如删除Subs中的第一个子项后再到mongo里面查询发现第一个子项仍然存在。 暂时还没有好的解决方法如果有涉及到数组子项的删除操作都是将整个对象删掉然后再重新插入简单粗暴。 转载于:https://www.cnblogs.com/nonkicat/p/5581726.html