【问题标题】:SUM for all columns in LINQLINQ 中所有列的 SUM
【发布时间】:2013-09-05 12:14:36
【问题描述】:

我有一个包含许多列(~200)的 SQL 表。

我想创建一个 LINQ 查询以按列获取所有行的总和。结果是一行,表示每列的总和。

如何完成这个 LINQ 查询?

很难为每一列创建一个特定的.Sum(...)

【问题讨论】:

  • “我有一个包含许多列的 SQL 表(~200)” 这就是问题所在。 Normalize你的桌子。
  • 我不能。这是一个正在生产的旧系统。我需要在旧的数据库格式上构建应用程序。

标签: c# .net sql-server linq sum


【解决方案1】:

您可以尝试使用:

var results = (from i in yourCollection
               group g by i.Column into g
               select new
               {
                   ColumnName = i.Column,
                   ColumnTotal = i.Sum(x => x.Value) 
               }).ToList();

【讨论】:

    【解决方案2】:

    为工作使用正确的工具。这次不是实体框架。这是一个简单的 ADO.NET 例程:

    public double[] SumAllColumns(IDbConnection connection)
    {
        using (var cmd = connection.CreateCommand())
        {
            cmd.CommandText = "SELECT * FROM YourTable";
            using (var reader = cmd.ExecuteReader())
            {
                var values = new double[reader.FieldCount];
                while (reader.Read())
                {
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        values[i] += reader.GetDouble(i);
                    }
                }
    
                return values;
            }
        }
    }
    

    该方法返回一个数组,其中包含每列的总和。

    【讨论】:

      【解决方案3】:
      double sum = Table.Select(t => t.Amount ?? 0).Sum();
      

      double sum = Table.Sum(t => t.Amount ?? 0);
      

      【讨论】:

        【解决方案4】:
        var sums = (from c in columns
            group c by c.columnName into g
            select new
            {
                SumCol1 = g.Sum(x => x.Col1), 
                SumCol2 = g.Sum(x => x.Col2) 
            }).SingleOrDefault;
        

        例如访问控制台应用程序中的变量...

        Console.Write(sums.SumCol1.ToString() + " : " + sums.SumCol2.ToString());
        

        【讨论】:

          【解决方案5】:

          我用过这个解决方案:

          from res in datacTx.Table
                  where ...
                  group re by re.id into g
                  select new
                  {
                   col1 = g.Sum(x => x.col1),
                   col2 = g.Sum(x => x.col2),
                   ...
                  };
          

          但我现在无法访问任何值,或者我无法将结果转换为列表,其中每列代表列表中的一个条目。

          到目前为止,我一直使用它来访问 linq 查询的值:

          foreach (var propertyInfo in res.GetType().GetProperties())
          {
           ...
          }
          

          但现在这不起作用,因为我没有任何属性。

          【讨论】:

            【解决方案6】:

            您可以使用 sql 命令,该命令的执行为每一行返回一个结果数组,然后使用 array.Sum()。

            或者添加一个sql计算列。

            【讨论】:

            • array.Sum() 是一个 linq to object 方法。列没有 linq to sql 方法。
            猜你喜欢
            • 1970-01-01
            • 2015-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多