【问题标题】:Decrementing a uint field in c# mongodb在c#mongodb中减少一个uint字段
【发布时间】:2018-03-11 22:28:45
【问题描述】:

我正在尝试将 uint 字段从 1 减少到 0。由于 Inc 的工作方式,我必须将其转换为 int,如下所示:

UpdateDefinition<Student> updateDef = Builders<Student>.Update.Inc(s => (int)s.Grade, -1);
GetStudentCollection().UpdateOne(s => s.Id == 12345, updateDef);

当我使用1 而不是-1 递增时,这非常有效,但是当我运行此代码时,我收到以下错误:

System.OverflowException: Value was either too large or too small for a UInt32.
   at System.Convert.ToUInt32(Int32 value)

我已从该 LINQ 查询中调试了检索到的 Student,并在尝试递减之前确认 s.Grade 位于 1。由于0 在有效的uint 范围内,我不明白为什么它会这样出错。

我可能会遗漏什么以及如何绕过投射uint? (除了“不要使用 uints”之外的解决方案)

【问题讨论】:

  • 你为什么要选角?
  • @AluanHaddad 因为Inc 要求我这样做。它不会接受 uint 参数。

标签: c# mongodb


【解决方案1】:

UpdateDefinitionBuilder 中的Inc 定义为:

public UpdateDefinition<TDocument> Inc<TField>(FieldDefinition<TDocument, TField> field, TField value);

相同的类型TField 用于字段定义(FieldDefinition&lt;TDocument, TField&gt;)和增量值,这就是为什么下面的表达式不会编译:

Builders<Student>.Update.Inc(x => x.Grade, -1);

通过将 x.Grade 转换为 int,您可以欺骗编译器,但不能欺骗 MongoDB 驱动程序。最终,驱动程序将尝试将-1 的值转换为uint 的模型类型,这会抛出OverflowException

如果您想为Grade 属性保留uint 的数据类型并有可能减少它,我能想到的唯一方法是绕过强类型UpdateDefinition 并使用原始$inc 运算符:

GetStudentCollection().UpdateOne(s => s.Id == 12345, "{ $inc: { Grade: -1 } }");

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多