MongoDB C#驱动中能否在更新表达式中使用强制转换操作?
问题描述
我定义了如下继承层次结构:
public abstract class Foo { } public class Bar : Foo { public bool Value { get; set; } } public class Container { public Foo? Foo { get; set; } }
尝试执行如下更新操作时失败:
Builders<Container>.Update.Set(x => ((Bar) x.Foo!).Value, true);
抛出异常:
MongoDB.Driver.Linq.ExpressionNotSupportedException: Expression not supported: Convert(x.Foo, Bar).
用as转换也会出现类似错误。另外类似的转换表达式在投影操作中可正常工作,我只是想更新多态对象中的指定字段,不需要在数据库中执行转换。
解决方案
MongoDB .NET驱动的表达式树解析器在更新操作中不支持这种类型转换表达式,但可以通过直接指定字段路径字符串的方式绕过这个限制:
- 硬编码字段路径(简单但不够类型安全):
Builders<Container>.Update.Set("Foo.Value", true);
- 用
nameof拼接路径(类型安全,避免硬编码错误):
var fieldPath = $"{nameof(Container.Foo)}.{nameof(Bar.Value)}"; Builders<Container>.Update.Set(fieldPath, true);
这种方式直接告诉驱动要更新的字段路径,不需要依赖表达式树的类型转换解析,就能正常更新多态对象中的指定字段。
内容的提问来源于stack exchange,提问作者Ilya Chernomordik
相关产品推荐
相关产品推荐

