说我在我的数据库中有这个
courseName : English101
Mark : 80
OutOff : 100
Weight : 50
CourseName : English101
Mark : 30
OutOff : 50
Weight : 10
CourseName: Chem101
Mark : 100
OutOff: 100
Weight : 100
现在我想找到这两门课程的全部成绩
首先是english101。
(80/100)* 50 = 40(达到重量) (30/50)* 10 = 6
40 + 6 = 46/100(当然体重总是高达100% - 这意味着40%的体重尚未分配,但仍会再次计算整体标记。)
所以如果这个学生退出英语101,他们的最终分数将是46%。
现在我根本不知道如何做到这一点。首先,我尝试在从数据库中检索时使用Group by和Sum函数将所有标记,outOff和权重相加。
然而,这给出了不同于我期望的百分比。所以我需要逐行进行。
所以我必须添加每一行然后从English101中取出所有的行并加上他们实现的重量。
但我不知道怎么做。我尝试使用字典并使用courseName作为键,然后检查下一行是否具有相同的courseName。然后我会从该字典中提取当前值并将其添加到该字典中。
但是我只做了它的一半,我有一个foreach循环和3个嵌套的if语句。
所以应该有更好的方法。
我正在使用linq来实现sql。我不确定在它来自数据库的时候我可以用它做这一切。
答案 0 :(得分:1)
怎么样:
var results = from course in courses
where course.OutOf != 0
group course by course.CourseName into grouped
select new { CourseName = grouped.Key,
Mark = grouped.Sum(item =>
(item.Mark * item.Weight) / item.OutOf) };
在LINQ to Objects中进行测试:
using System;
using System.Linq;
class Test
{
static void Main(string[] args)
{
var courses = new[]
{
new { CourseName = "English101", Mark = 80, OutOf = 100, Weight =50},
new { CourseName = "English101", Mark = 30, OutOf = 50, Weight = 10},
new { CourseName = "Chem101", Mark = 100, OutOf = 100, Weight = 100 }
};
var results = from course in courses
where course.OutOf != 0
group course by course.CourseName into grouped
select new { CourseName = grouped.Key,
Mark = grouped.Sum(item =>
(item.Mark * item.Weight) / item.OutOf) };
foreach (var result in results)
{
Console.WriteLine(result);
}
}
}
我不知道在数据库中完成时你是否需要担心整数运算和除法...你可能不希望截断总和的每一位的结果。
某些行将丢失的事实无关紧要,因为有效行的权重仍将累加到适当的数量。