【问题标题】:optimization or alternate of linq (for aggreation) C#linq 的优化或替代(用于聚合)C#
【发布时间】:2014-04-03 13:23:16
【问题描述】:

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

【问题讨论】:

    标签: c# performance linq


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      首先,LINQ 与性能无关——它与便利有关。要了解它的性能,您需要进行概要分析。首先要做的是找出:

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

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

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

      【讨论】:

      • 感谢您的宝贵意见,但就我而言,我正在查询内存对象。我忘记在我的问题中提及这一点。无论如何,你的观点很有帮助。谢谢
      • 其次,我正在寻找使用 linq 的任何可能替代方案,您有什么想法吗?
      • @asif 原始 TSQL 和“dapper”
      • Dapper 听起来很有趣,让我看看它是否适合我的情况。谢谢
      • 是否可以将 dapper 与内存对象一起使用,而不是打开与数据库的连接?
      【解决方案3】:

      你可以用老式的方式来做 :) 按城市、性别、年龄对 jc 进行排序。遍历排序结果求和总体。当城市、性别、年龄发生变化时,输出之前的城市、性别、年龄和总和的汇总。将总和重置为零并继续。

      【讨论】:

        猜你喜欢
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多