我有一个有很多列的SQL表(约200列)。
我想创建一个LINQ查询,以获得所有行的列的总和。结果将是一行,代表每列的SUM。
如何才能完成这个LINQ查询?
要创建一个特定的LINQ查询是很困难的。.Sum(...)
的每一列。
你可以尝试使用。
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();
使用正确的工具来完成任务。这次不是Entity Framework。这里有一个简单的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;
}
}
}
该方法返回一个数组,其中包含每列的总和。
double sum = Table.Select(t => t.Amount ?? 0).Sum();
或
double sum = Table.Sum(t => t.Amount ?? 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());
我已经使用了这个解决方案,但我现在无法访问任何值,或者我无法将结果转换成一个列表,其中每个列代表列表中的条目。
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())
{
...
}
但现在这行不通,因为我没有任何属性。
你可以使用sqlcommand,执行时为每行返回一个结果数组,然后使用array.Sum()。
或者增加一个sql计算列。