Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq(用于攻击)C的优化或替代#_C#_Performance_Linq - Fatal编程技术网

C# linq(用于攻击)C的优化或替代#

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),

我想优化以下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 我不是从数据库查询它,但我有用于生成摘要的自定义内存对象。

而不是
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,而不是打开到数据库的连接?