我想优化以下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 我不是在数据库中查询它,而是在内存对象中使用自定义来生成摘要。
答案 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。如果数据库时间很好,但是在.NET中执行需要花费很多时间,那么它可能是映射器故障(有时会发生) - 考虑像dapper这样的工具。如果它只是行数:想一个新的设计;也许是传呼。
优化没有一个答案。首先,您需要确定瓶颈。
答案 2 :(得分:0)
你可以用老式的方式做到:)按城市,性别,年龄排序jc
。迭代排序结果总和人口。当城市,性别,年龄变化时,输出与以前的城市,性别,年龄和总和的摘要。将总和重置为零并继续。