如何在MongoDB C#驱动程序中动态设置属性

时间:2017-03-22 02:44:38

标签: c# mongodb mongodb-query mongodb-.net-driver mongodb-csharp-2.0

我创建了一个接受JObject的扩展方法,并为C#MongoDB驱动程序生成更新定义。我们的想法是JObject中的属性和值用于映射和更新数据库中的属性。但是,更新查询始终会抛出异常。

我的扩展方法采用更新定义构建器并执行以下操作:

public static UpdateDefinition<T> SetFromPropsInObject<T>(this UpdateDefinitionBuilder<T> builder, object obj) {
  var objType = obj.GetType();
  UpdateDefinition<T> returnBuilder = null;
  var tType = typeof(T);

  if (obj is JObject) {
    var jObj = (JObject)obj;

    foreach (var property in jObj.Properties()) {
      var propFromReflection = TypeDescriptor.GetProperties(tType).Find(property.Name.ToPascalCase(), false);

      if (property.Name.ToLower() != "id" &&
          propFromReflection != null) {
        if (returnBuilder == null) {
          returnBuilder = builder.Set((s) => propFromReflection.GetValue(s), (string)property.Value);
        } else {
          returnBuilder.Set((s) => propFromReflection.GetValue(s), (string)property.Value);
        }
      }
    }
  }

  return returnBuilder;
}

我处理与数据库交互的存储库类有一个接受对象的方法,并尝试使用对象中的数据更新数据库中的对象。

public async Task<UpdateResult> UpdateUser(string id, object updateWith) {
  var filter = Builders<User>.Filter.Eq(s => s.Id, id);
  var update = Builders<User>.Update
                             .SetFromPropsInObject(updateWith);
  return await _dbContext.Users.UpdateOneAsync(filter, update);
}

但是,UpdateOneAsync方法调用会引发以下异常

Unable to determine the serialization information for s =>
value(Namespace.Data.MongoUtilities+<>c__DisplayClass0_0`1[Namespace.Models.User])
.propFromReflection.GetValue(Convert(s)).

我已经阅读过有关Stack Overflow的类似问题,关于如何使用MongoDB C#驱动程序动态设置属性,但不幸的是,解决方案总是只是使用反射 - 我已经做过了果。

1 个答案:

答案 0 :(得分:0)

错误说,你不能在查询中使用propFromReflection.GetValue。这个lambda表达式用于获取属性的名称,并且它不了解propFromReflection.GetValue是什么。