Как вычислить Math.Sqrt для десятичного числа, используя драйвер mongoDB c # с IQueryable - PullRequest
0 голосов
/ 19 декабря 2018

Я использую десятичные числа для хранения моих данных на mongoDB, потому что мне нужно иметь как можно большую точность.Чтобы использовать $ sqrt на mongoDB, вам нужно передать в качестве аргумента значение double, поэтому мне нужно привести свое десятичное число к двойному, а затем передать его в $ sqrt.Использование оболочки mongoDB - это простая работа, но когда вы пытаетесь закодировать это с помощью драйвера mongoDB c # с интерфейсом IQueryable, все становится сложнее.

Мой код:

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?

...