如何使用带有IQueryable

时间:2018-12-19 13:36:22

标签: c# mongodb mongodb-.net-driver

我正在使用小数位将数据存储在mongoDB上,因为我需要尽可能地提高精度。
要在mongoDB上使用$ sqrt,您需要传递double作为参数,因此我需要将十进制数转换为double,然后将其传递给$ sqrt。
使用mongoDB shell确实很容易,但是当您尝试使用带有IQueryable接口的mongoDB c#驱动程序编写此代码时,事情就变得复杂了。

我的代码:

var data = _myRepository.AsQueryable()
.GetValues(equipmentId, startDate, endDate)
.GroupBy(g => g.timestamp)
.Select(p => new MyDTO {
    timestamp = p.Key,
    sqrt_calc = (decimal)Math.Sqrt(
            (double)p.Sum(x => x.my_decimal_value)
        )
.OrderBy(q => q.timestamp);

我收到以下异常: OverflowException:算术运算导致溢出。

IQueryable正在产生以下查询:

aggregate([{
        "$match": {
            "timestamp": {
                "$gte": ISODate("2018-12-18T12:23:48Z"),
                "$lte": ISODate("2018-12-19T12:23:48Z")
            },
            "equipment_id": NumberLong(168)
        }
    }, {
        "$group": {
            "_id": "$timestamp",
            "__agg0" : { "$sum" : "$my_decimal_value" }
        }
    }, {
        "$project": {
            "timestamp": "$_id",
            "sqrt_calc": { "$sqrt" : ["$__agg0"] }
            "_id": 0
        }
    }, {
        "$sort": {
            "timestamp": 1
        }
    }
])

如您所见,在$ sqrt之后缺少$ toDouble,因此$ sqrt正在接收小数并产生NaN,我认为这是导致异常的原因。 有没有办法告诉IQueryable添加$ toDouble强制转换?

0 个答案:

没有答案
相关问题