优化或替代linq(用于聚合)C#

时间:2014-04-03 13:23:16

标签: c# performance linq

我想优化以下LINQ语句的性能,或者需要一些可以更有效地执行的替代方案...

var temp = (from r in jc
            group r by new { r.City, r.Gender, r.AgeBracket } into g
            select new Summary
            {
                Population = g.Sum(x => (decimal)x.Population),
                State = g.Select(x => x.City).First(),
                Gender = g.Select(x => x.Gender).First(),
                AgeBracket = g.Select(x => x.AgeBracket).First()
            }).ToArray();

请让我知道LINQ执行此类操作的任何替代方法,因为我发现LINQ在生成大量数据时会产生相当大的性能开销。

编辑-1 我不是在数据库中查询它,而是在内存对象中使用自定义来生成摘要。

3 个答案:

答案 0 :(得分:4)

您可以使用g.Select(xxx).First代替g.Key.XXX

select new Summary
   {
       Population = g.Sum(x => (decimal)x.Population),
       State = g.Key.City,
       Gender = g.Key.Gender,
       AgeBracket = g.Key.AgeBracket
   }

答案 1 :(得分:2)

首先,LINQ并不是关于性能 - 它是关于方便性的。要了解它的执行情况,您需要进行分析。首先要做的是找出:

  • 它正在生成什么样的TSQL
  • 返回的行数
  • 在数据库中执行需要多长时间
  • 在客户端执行需要多长时间

如果TSQL看起来很好,并且两个时序大致相同,那么您可能需要添加索引。如果TSQL很糟糕和/或在数据库中运行时间太长,那么您可能需要手动滚动TSQL。如果数据库时间很好,但是在.NET中执行需要花费很多时间,那么它可能是映射器故障(有时会发生) - 考虑像dapper这样的工具。如果它只是行数:想一个新的设计;也许是传呼。

优化没有一个答案。首先,您需要确定瓶颈。

答案 2 :(得分:0)

你可以用老式的方式做到:)按城市,性别,年龄排序jc。迭代排序结果总和人口。当城市,性别,年龄变化时,输出与以前的城市,性别,年龄和总和的摘要。将总和重置为零并继续。