C#LINQ和涉及大型数据集的计算

Row*_*wen 5 c# linq performance list

这更像是一个技术性的"操作方法"或"最佳方法"问题.

我们当前要求从数据库中检索记录,将它们放入"内存中"列表,然后对数据执行一系列计算,即最大值,平均值和一些更具体的自定义统计信息.

将数据放入"内存中"列表不是问题,因为我们使用NHibernate作为我们的ORM,并且它在从数据库中检索数据方面表现出色.我正在寻求的建议是我们应该如何最好地对结果数据列表进行计算.

理想情况下,我想为每个统计信息创建一个方法,MaximumValue(),AverageValueUnder100(),MoreComplicatedStatistic()等等.当然,将所需的变量传递给每个方法并让它返回结果.这种方法也可以使单元测试变得轻而易举,并为我们提供了极好的覆盖范围.

如果我们为每个计算执行LINQ查询,或者应该在尽可能少的LINQ查询中合并每个统计方法的次数,那么是否会有性能损失.例如,将数据列表传递给名为AverageValueBelow100的方法没有多大意义,然后将整个数据列表传递给另一个方法AverageValueBelow50,当它们可以通过一个LINQ查询有效地执行时.

如何在不牺牲性能的情况下实现高水平的粒度和分离?

任何建议......问题是否足够明确?

Jim*_*ley 1

根据计算的复杂性,最好在数据库中进行。如果它非常复杂,您需要将其作为对象引入并产生开销,您可能希望避免对结果集进行多次迭代。您可能需要考虑使用聚合。请参阅http://geekswithblogs.net/malisancube/archive/2009/12/09/demystifying-linq-aggregates.aspx进行讨论。您将能够单独对每个聚合进行单元测试,然后(可能)在单次迭代中投影多个聚合。