1

我有一个使用平均成绩的 LINQ 语句,但问题是有时

等级显示为 3.777777,但我希望它是 3.7 如何在我的 linq 语句中截断它?

这是我的 LINQ 声明:

public List<CoreValueAndAverageGrade> GetAverageGradeForAllCoreValues2()
{
    var answers = db.GoalCardQuestionAnswer
        .Where(answer => answer.Grade.HasValue
            && (answer.SelectedQuestion.Question is CoreValueQuestion
                && (answer.SelectedQuestion.Question as CoreValueQuestion).SubjectType.Ignored_Statistic == false));
    var groupedByCoreValue = answers.GroupBy(answer => (answer.SelectedQuestion.Question as CoreValueQuestion).CoreValue);

    return groupedByCoreValue
        .OrderBy(group => group.Key.Name)
        .Select(group => new CoreValueAndAverageGrade
        {
            CoreValue = group.Key,
            AverageGrade = group.Any() ? group.Average(answer => answer.Grade.Value) : 0
        }).ToList();

也许它可以在我的操作方法中的控制器内部进行吗?

var averageGrades = OfficeStatisticRepository.GetAverageGradeForAllCoreValues2();

var dataItems = (averageGrades.Select(averageGrade => averageGrade.AverageGrade).ToArray()); // here
4

1 回答 1

2

你在这里有三个选择。

1)在 Linq 查询中使用Math.Truncate就像您使用Averageor一样Aggregate。作为 Linq->SQL 翻译的一部分。

...
... ? group.Average(answer => Math.Truncate(10 * answer.Grade.Value) / 10) : 0M
...

有趣的是,文档提到了一个System.Math.Truncate(decimal, int)方法,但它实际上并不存在......幸运的是,你可以乘法和四舍五入。这适用于小数,但如果您的成绩是双倍,则可能会因为除法而导致新的舍入问题。

2) 在使用decimal.Round调用 ToList 后,对 Linq 查询中的值进行四舍五入(确保选择正确的舍入方向,因为您不想使用银行家四舍五入的成绩。

 var groupedByCureValue = answers.GroupBy....ToList();
 /* then in the next query use Math.Truncate or Math.Round as you 
    would otherwise, you can now use MidPointRounding if you want to 
    no sql translation is done as this is all executed in memory, 
    so you're free to use any framework method available to you. */

3) 保持值不变,仅使用显示格式在 UI 中显示四舍五入的值,例如F1用于显示值的文本框/标签/绑定。如何设置取决于您使用的显示框架。如果组中有 3.77 和 3.76,这将不会合并值。

于 2012-05-21T09:39:21.207 回答