我有一个使用平均成绩的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();
Maby可以在我的动作方法中在控制器内完成吗?
var averageGrades = OfficeStatisticRepository.GetAverageGradeForAllCoreValues2();
var dataItems = (averageGrades.Select(averageGrade => averageGrade.AverageGrade).ToArray()); // here
答案 0 :(得分:2)
这里有三个选项。
1)使用Math.Truncate
在Linq查询中进行回合就像使用Average
或Aggregate
一样。作为Linq-&gt; SQL翻译的一部分。
...
... ? group.Average(answer => Math.Truncate(10 * answer.Grade.Value) / 10) : 0M
...
有趣的是the docs mention a System.Math.Truncate(decimal, int)
method,但它实际上并不存在......幸运的是,你可以成倍增加。这对于Decimals可以正常工作,但是如果你的等级是Double,则可能会因为划分而导致新的舍入问题。
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)保持值不变,只在您使用显示值的文本框/标签/绑定上使用F1
等显示格式显示UI中的舍入值。如何设置它取决于您正在使用的显示框架。如果组中有3.77和3.76,则不会合并值。