【问题标题】:How can I add this stuff up that is coming from a database?如何添加来自数据库的这些东西?
【发布时间】:2009-09-27 06:12:42
【问题描述】:

假设我的数据库中有这个

courseName : English101
Mark : 80
OutOff : 100
Weight : 50

CourseName : English101
Mark : 30
OutOff : 50
Weight : 10

CourseName: Chem101
Mark  : 100
OutOff: 100
Weight : 100

现在我想找出这两门课程的总成绩

第一个英语101。

(80 /100) * 50 = 40(达到的重量) (30 / 50) * 10 = 6

40 + 6 = 46 / 100(课程重量总和将始终达到 100% - 这意味着 40% 的重量尚未分配,但仍会再次计入总分。)

因此,如果该学生从英语 101 中辍学,他们的最终成绩将是 46%。

现在我根本不知道该怎么做。起初,我尝试在从数据库中检索时使用 Group by 和 Sum 函数将所有标记、outOff 和权重相加。

但是,这给出的百分比与我预期的不同。所以我需要逐行做。

所以我必须把每一行加起来,然后从 English101 中取出所有行,然后把它们的重量加起来。

但我不知道如何做到这一点。我尝试使用字典并使用 courseName 作为键,然后检查下一行是否具有相同的 courseName。然后我会从该字典中提取当前值并将其添加到其中。

但我只完成了一半,我有 1 个 foreach 循环和 3 个嵌套 if 语句。

所以应该有更好的办法。

我正在使用 linq to sql。当它来自数据库时,我不确定我是否可以使用它来完成所有这些工作。

【问题讨论】:

  • "(30 / 50) * 10 = 6" 你确定吗?
  • 哎呀,不应该这么早看问题:(

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


【解决方案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);
        }
    }
}

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

缺少某些行的事实无关紧要,因为有效行的权重仍然会加起来适当的数量。

【讨论】:

  • 哇,我不认为我会想到做 Mark * Weight / OutOf。你的数学天才哈哈。我不确定您所说的“不知道在数据库中完成整数算术和除法时是否需要担心......您可能不希望总和的每一位的结果都被截断。 "另外我应该提到,即使没有 overAllGrade,我仍然想获取课程前缀。这似乎忽略了没有填写任何内容的课程(即数据库中的空值)。
  • 哦,另一个问题是因为我有空值和东西,我可以除以零错误。
  • 要包含没有分数的课程,请使用空合并运算符:item.Mark ?? 0 等。精确部分是为了避免将(例如)12.5 的两个部分分数相加但最终得到的问题24 而不是 25 - 如果你用整数算术做所有事情,你最终会在总和之前四舍五入,这并不理想。
  • 如果您有空权重,您可能应该使用条件:(item.Weight == 0 || item.Weight == null ? 0 : ...)
  • 抱歉,我不确定如何使用这个合并运算符。你能更新你的例子吗? Mark,Weight,OutOf都是数据库中的小数所以我认为我不会遇到这个问题(如果我错了请纠正我。)
猜你喜欢
  • 2015-02-01
  • 2012-08-11
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2020-01-11
相关资源
最近更新 更多