这更像是一个技术性的“操作方法”或“最佳方法”问题。
我们当前需要从数据库中检索记录,将它们放入“内存中”列表中,然后对数据执行一系列计算,即最大值、平均值和一些更具体的自定义统计信息。
将数据放入“内存中”列表不是问题,因为我们使用 NHibernate 作为我们的 ORM,它在从数据库中检索数据方面做得非常出色。我正在寻求的建议是我们应该如何最好地对结果数据列表进行计算。
理想情况下,我想为每个统计数据创建一个方法,MaximumValue()、AverageValueUnder100()、MoreComplicatedStatistic() 等等。当然,将所需的变量传递给每个方法并让它返回结果。这种方法还将使单元测试变得轻而易举,并为我们提供出色的覆盖率。
如果我们对每个计算执行 LINQ 查询,是否会影响性能,或者应该在尽可能少的 LINQ 查询中合并对每个统计方法的尽可能多的调用。例如,将数据列表传递给一个名为 AverageValueBelow100 的方法,然后将整个数据列表传递给另一个方法 AverageValueBelow50 没有多大意义,因为它们可以通过一个 LINQ 查询有效地执行。
我们如何在不牺牲性能的情况下实现高级别的粒度和分离?
有什么建议……问题够清楚吗?
最佳答案
根据计算的复杂程度,最好在数据库中进行。如果它非常复杂,您需要将其作为对象引入并产生开销,您可能希望避免对结果集进行多次迭代。您可能要考虑使用聚合。参见 http://geekswithblogs.net/malisancube/archive/2009/12/09/demystifying-linq-aggregates.aspx讨论如果它。您将能够分别对每个聚合进行单元测试,然后(可能)在单个迭代中投影多个聚合。
关于C# LINQ 和涉及大型数据集的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174628/