2013-09-05 63 views
0

我有一個包含許多列(〜200)的SQL表。LINQ中所有列的SUM

我想創建一個LINQ查詢來獲得所有行按列的總和。結果是表示每列的總和的一行。

該如何做這個LINQ查詢?

很難爲每列創建具體的.Sum(...)

+3

_「我有一個有很多列的SQL表(〜200)」_這就是問題所在。 [Normalize](http://en.wikipedia.org/wiki/Database_normalization)你的表。 –

+2

我不行。這是一個正在生產的舊系統。我需要以舊數據庫格式構建應用程序。 – dpv

回答

2

你可以嘗試使用:

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(); 
-1

你可以使用SqlCommand,其執行返回的每一行的結果數組,然後使用array.Sum()。

或者添加一個sql計算列。

+0

-1 OP問一個LINQ的解決方案 – Alex

+0

array.Sum()是一個linq to object方法。列的sql方法沒有linq。 – Softlion

+0

我不好,你說得對。當它允許我時,它將不會降級! – Alex

0
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()); 
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; 
     } 
    } 
} 

該方法返回一個數組,其中包含每列的總和。

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

OR

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

我用這個解決方案:

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()) 
{ 
... 
} 

,但現在這是行不通的,因爲我沒有任何屬性。