C# linq(用于攻击)C的优化或替代#
我想优化以下LINQ语句的性能,或者需要一些能够以更有效的方式执行的替代方案C# linq(用于攻击)C的优化或替代#,c#,performance,linq,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),
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
我不是从数据库查询它,但我有用于生成摘要的自定义内存对象。而不是g.Select(xxx)。首先可以使用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
}
代替g.Select(xxx)。首先可以使用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
}
首先,LINQ不是关于性能,而是关于方便性。要了解它是如何运行的,您需要配置文件。首先要做的是找出:
- 它正在生成什么TSQL
- 返回多少行
- 在数据库中执行需要多长时间
- 在客户端执行需要多长时间
如果TSQL看起来很好,并且两个计时几乎相同,那么您可能需要添加索引。如果TSQL非常糟糕,并且/或者在数据库中运行的时间太长,那么您可能需要手动滚动TSQL。如果数据库的时间很好,但是在.NET中要花费很多时间,那么它可能是映射器故障(有时会发生)-考虑像DaPER这样的工具。如果仅仅是行数:考虑一个新的设计;也许是寻呼
优化没有一个答案。首先,您需要确定瓶颈。首先,LINQ不是关于性能,而是关于方便性。要了解它是如何运行的,您需要配置文件。首先要做的是找出:
- 它正在生成什么TSQL
- 返回多少行
- 在数据库中执行需要多长时间
- 在客户端执行需要多长时间
如果TSQL看起来很好,并且两个计时几乎相同,那么您可能需要添加索引。如果TSQL非常糟糕,并且/或者在数据库中运行的时间太长,那么您可能需要手动滚动TSQL。如果数据库的时间很好,但是在.NET中要花费很多时间,那么它可能是映射器故障(有时会发生)-考虑像DaPER这样的工具。如果仅仅是行数:考虑一个新的设计;也许是寻呼
优化没有一个答案。首先,你需要找出瓶颈。你可以用老式的方法:)按城市、性别、年龄对jc进行排序。遍历排序结果求和总体。当城市、性别、年龄发生变化时,输出上一个城市、性别、年龄和总和的摘要。将总和重置为零,然后继续。你可以用老式的方法:)按城市、性别、年龄对jc进行排序。遍历排序结果求和总体。当城市、性别、年龄发生变化时,输出上一个城市、性别、年龄和总和的摘要。将总和重置为零并继续。谢谢您的宝贵意见,但就我而言,我正在查询内存中的对象。我忘了在我的问题中提到这一点。无论如何,你的观点是有帮助的。谢谢第二,我正在寻找使用linq的任何可能的替代方法,你有什么想法吗?@asif raw TSQL和“dapper”dapper听起来很有趣,让我看看它是否适合我的情况。感谢您可以对内存中的对象使用dapper而不是打开到数据库的连接吗?谢谢您的宝贵意见,但就我而言,我是在查询内存中的对象。我忘了在我的问题中提到这一点。无论如何,你的观点是有帮助的。谢谢第二,我正在寻找使用linq的任何可能的替代方法,你有什么想法吗?@asif raw TSQL和“dapper”dapper听起来很有趣,让我看看它是否适合我的情况。Thank是否可以对内存中的对象使用dapper,而不是打开到数据库的连接?