使用linq进行求和和分组

时间:2013-06-03 20:16:14

标签: c# sql linq group-by sum

我一直在尝试从看起来像image1的表中编译数据并将其转换并显示到像image2这样的表中。

IMAGE1

img1 http://i44.tinypic.com/fjesl2.png

图像2

img1 http://i39.tinypic.com/el790o.png

首先我想我会这样做: 一个名为Region的类,它包含一个名为server的类的列表 服务器类将具有3个属性serverid,servername和名为CostData的类的列表。 CostData将存储年月和本月成本的总和。

我已经使用linq管理了一个查询,该查询为我提供了每月每台服务器的总数,例如: 2013年,月份:1,服务器:Server1,总计:460

我仍然发现自己缺少一些东西。首先,我需要将每个服务器的月总数放在一个地方,就像我尝试使用我的CostData一样,这样我用html就可以迭代每个月的服务器并将它们显示在列中。

此外,通过此解决方案,我仍然错过了CostDesc列,我也想显示每月总数,就像你可以在image2上一样。

以下是我的课程:

public class Region
{        
public List<Server> Servers { get; set; }
}

public class Server
{               
public string ServerID { get; set; }
public string ServerName { get; set; }
public List<CostData> MonthlyCosts { get; set; }
}

public class CostData
{
public string Date { get; set; }
public double Sum { get; set; }
}

这就是我构建对象的方式:

Region r = new Region();
r.servers = new List<Server>();

foreach (var row in linqQueryResult)
    {
            Server s = new Server();
            s.ServerID = row.ServerID;
            s.ServerName = row.ServerName;
            s.MonthlyCosts = new List<CostData>();
            CostData cd = new CostData();
            cd.Date = row.Year.ToString() + "-" + row.Month.ToString();
            cd.Sum = row.ServerSum;
            s.MonthlyCosts.Add(cd);                    
            r.Servers.Add(s);

    }


    return View(r);

你有什么指示或建议吗?我希望有更多经验的人可以看看并给我一些建议,而不是要求整个解决方案,尽管如果你想这样做我不介意:)

我想知道是否有一种很好的方法可以使用linq获取我想要的数据。对此的关注是我只能访问一个只提供image1中数据的存储过程。所有对数据的操作都必须使用c#在本地完成,尽管这可能不是一件坏事。

1 个答案:

答案 0 :(得分:2)

您需要执行通常所说的PIVOT或交叉表。这应该有助于:Is it possible to Pivot data using LINQ?

然后看起来你想要一个总计函数来添加特殊的总行,然后可能是一个自定义的排序顺序。完成转轴后,其余部分相当容易。

完成行后,可以通过执行单独的查询来实现总行数(分组依据)。然后将两个结果结合在一起。如果添加排序列,则可以对结果进行排序,最后得到完成的结果集。