如何添加来自数据库的这些内容?

时间:2009-09-27 06:12:43

标签: .net asp.net linq linq-to-sql

说我在我的数据库中有这个

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。我不确定在它来自数据库的时候我可以用它做这一切。

1 个答案:

答案 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);
        }
    }
}

我不知道在数据库中完成时你是否需要担心整数运算和除法...你可能不希望截断总和的每一位的结果。

某些行将丢失的事实无关紧要,因为有效行的权重仍将累加到适当的数量。