You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:31:15