Math.Round в linq для объектов против linq для объектов - PullRequest
0 голосов
/ 30 октября 2018

Поведение следующего отличается, и это трудно управлять, в зависимости от того, был ли выполнен запрос:

using (var db = new DbContext()) 
{
    db.Entities.Select(x => Math.Round(0.5)).First(); // return 1
    db.Entities.ToList().Select(x => Math.Round(0.5)).First(); // returns 0
    db.Entities.AsEnumerable().Select(x => Math.Round(0.5)).First(); // returns 0
} 

Конечно, мой действительный код выполняет операцию на x. это для простоты.

Я знаю, что есть Math.Round с MidpointRounding , но он не поддерживается Linq to Entities:

LINQ to Entities не распознает метод 'Double Round (Double, System.MidpointRounding) ', и этот метод не может быть переведен в магазинное выражение.

Мой вопрос, кроме выполнения запроса и округления в памяти, есть ли способ иметь такое же поведение в c # и Linq to Entities?

Есть ли способ установить поведение Math.Round по умолчанию, чтобы всегда использовать MidpointRounding.AwayFromZero?

1 Ответ

0 голосов
/ 31 октября 2018

Исходя из ответа на этот вопрос не похоже, что то, что вы спрашиваете, возможно. Ответ на этот вопрос также рекомендует извлекать данные, используя AsEnumerable, как и другие комментарии по этому вопросу, и выполнять округление данных в памяти, используя локальный запрос.

var rawData = db.Entities.Select(x => 0.5); 
var rounded =  rawData.AsEnumerable().Select(x => Math.Round(x, MidpointRounding.AwayFromZero));
...