动态列使用MVC进行报告

时间:2013-12-04 06:11:38

标签: sql asp.net-mvc linq

我有一个表格数据如下:

 CompanyName     Amount        Date
 -------------------------------------
 CompanyA        150.00     2013-01-02
 CompanyB         40.00     2013-01-05
 CompanyC         75.00     2013-02-02
 CompanyA        250.00     2013-02-12
 CompanyB        100.00     2013-03-27
 CompanyC        350.00     2013-04-01
    .
    .
    .

我需要建立一个包含日期范围和所选公司的报告如下:

 Company    Jan-13  Feb-13  Mar-13  Apr-13  May-13  ...   Total
 ----------------------------------------------------------------
 Company A  $150    $239    $30     $500    $0      ...   $1,809
 Company B  $80     $0      $150    $200    $0      ...   $1,730
 Company C  $50     $30     $239    $0      $150    ...   $2,033
 Company D  $600    $150    $80     $30     $25     ...   $1,100
 Company E  $0      $50     $30     $150    $100    ...   $1,080
    .
    .
    .
    .
 MonthlyAmt $2,952   $1,377 $1,828  $2,470  $1,405  ...   $25,608

请注意,Month列是动态的,具体取决于日期范围输入。

SQL或Linq可以像这样甜蜜地检索数据吗?

如果不能,我的粗略想法是先得到一行数据如下:

 Company A  Amount
 -----------------
 Jan-13     150
 Feb-13     239
 Mar-13     30
    .
    .
    .
    .

之后使用循环收集所有数据并将其放入ViewBag数组中。 然后在View Page中分配数据。 但如果是这样的话,就没有排序功能和页面列表功能。 我可以知道有什么更好的想法吗?或者这是限制。

非常感谢。

1 个答案:

答案 0 :(得分:1)

在linqpad中检查完整示例(按日期过滤不在范围内) 如果当月没有交易,它不会为所有公司生成所有月份的记录。

void Main()
{
    var transactions = new List<transaction>(){
        new transaction() {
            volume = 5,
            company = "company1",
            date = DateTime.Parse("2012.12.15")
        },
        new transaction() {
            volume = 15,
            company = "company1",
            date = DateTime.Parse("2012.12.25")
        },
        new transaction() {
            volume = 25,
            company = "company2",
            date = DateTime.Parse("2012.12.25")
        },
        new transaction() {
            volume = 35,
            company = "company2",
            date = DateTime.Parse("2012.11.25")
        },
        new transaction() {
            volume = 45,
            company = "company3",
            date = DateTime.Parse("2012.12.25")
        },
    };

    transactions.Dump();

    var allTransactionsViewModel = transactions
            .GroupBy(t=>new {t.company,t.date.Month})
            .GroupBy(g=>g.Key.company, g=>new{g.Key.Month ,Total= g.Sum(t=>t.volume)})
            ;

    allTransactionsViewModel.Dump();        
}


class transaction {
 public int volume;
 public string company;
 public DateTime date;
}

所以你可以

    table   
      @foreach(var g in allTransactionsViewModel){  
       tr
        @foreach(var s in g){  
          td @s.total /td  
        }  
       /tr  
    /table