我正在尝试创建一个友好的报告,按一天中的时间汇总学生人数。我最初是从 Campusname 的循环开始,然后是 time,然后是 day 和 hi,但它效率极低且速度很慢。我决定采用另一种方法,在一次选择中选择我需要的所有数据并使用 c# 组织它。
我的问题是我不确定是否将其放入数组、列表、字典或数据表中来汇总注册并按如下所示进行组织(模型,未计算)。任何指导将不胜感激。
好吧,如果您只需要向用户显示一些数据(而不是对其进行编辑),您可能需要创建一个报告。
否则,如果您只需要总和,则可以在 anIEnumerable
和调用中获取所有数据.Sum()
。正如 colinsmith 所指出的,您可以并行使用 Linq。
但是有一件事是确定的……如果你有很多数据,你不想做很多查询。您可以在 SQL 中使用sum
查询(如果数据存储在数据库中),也可以从您获取的集合中求和。
您不想循环获取数据。在内存中处理数据比多次查询数据库然后处理它要快得多。
通常我会建议您在数据库中执行此操作,即使用 group by 等进行选择,我在弄清楚您的第一张图片与第二张图片在日期方面的关系时遇到了一些麻烦,所以我无法提供例子。
当然,您也可以在 C# 中使用 LINQ to 对象来执行此操作,但我会首先尝试在数据库中解决它,这样您在性能和带宽方面会更好。
就像是
select campusname, ssrmeet_begin_time, count(ssrmeet_monday), count(ssrmeet_tue_day) ..
from the_table
group by campusname, ssrmeet_begin_time
order by campusname, ssrmeet_begin_time
/
应该接近你想要的。计数只计算值,而不是 NULL。它也比首先将所有数据获取到客户端快数千倍。让数据库为你做分析,它已经有了所有的数据。
顺便说一句:而不是那些图片,给一些 ddl 和插入带有数据的语句来处理更聪明。这将邀请更多的人来帮助回答这个问题。
我不太确定你到底在追求什么。但据我了解,我建议您创建一个类来代表您的注册
public class Enrollment
{
public string CampusName { set;get;}
public DateTime DateEnrolled { set;get;}
}
并从数据库中获取所有注册详细信息到此类的集合
List<Enrollment> enrollments=db.GetEnrollments();
现在你可以对这个 Collection 做很多操作来得到你想要的数据
例如:如果您想在星期五进行所有注册
var fridaysEnrollMent = enrollments.
Where(x => x.DateEnrolled.DayOfWeek == DayOfWeek.Friday).ToList();
如果您想要在AA
校园内发生的入学人数
var fridayCount = fridaysEnrollMent .Where(d => d.CampusName == "AA").Count();