簡體   English   中英

等同於Coldfusion cfoutput GROUP的ASP.Net C#

[英]ASP.Net C# equivalent to Coldfusion cfoutput GROUP

我們目前正在將Coldfusion網站轉換為ASP.NET C#。 我們有一個使用三級cfoutput GROUP的報告(首先按年份分組,然后按代理分組,再按律師分組,並獲取分配給他們的案件總數)。

我很難找到一個如何將其轉換為ASP.NET的示例。

<cfquery name="getRecords" datasource="datasource">
    select datepart(yyyy, dtReceived) as [year], agencies.code, users.lname, users.fname        
    from cases left outer join users on cases.users_id=users.users_id
        left outer join agencies on cases.agencies_id = agencies.agencies_id   
    order by datepart(yyyy,dtReceived) desc,agencies.code, lname,fname
</cfquery>

<table>
<cfoutput query="getRecords" group="YEAR">
    <tr>
        <td>#YEAR#</td>
        <td>Office</td>
        <td>## Attorney(s)</td>
        <td>## Suspense(s)</td>
    </tr>    
    <cfoutput group="CODE">         
        <tr>
            <td>&nbsp;</td>
            <td>#htmleditformat(CODE)#</td>         
            <cfset i = 0>
            <cfoutput group="LNAME">
                <cfset i = i+1>
            </cfoutput>

            <td>#i#</td>

            <cfset j = 0>
            <cfoutput>
                <cfset j = j+1>
            </cfoutput>

            <td><strong>#j#</td>
        </tr>   

    <cfoutput group="LNAME">
            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>#htmleditformat(LNAME)#, #htmleditformat(FNAME)#</td>

                <cfset h = 0>
                <cfoutput>
                    <cfset h = h+1>
                </cfoutput>

                <td>#h#</td>
            </tr>
            </cfoutput>

    <tr>
        <td colspan="4">&nbsp;<br>&nbsp;</td>
    </tr>
    </cfoutput>


</cfoutput>
</table>

不如ColdFusion好,但是您可以使用linq對結果進行分組。

假設您有一個像這樣的對象列表

List<Case> Cases = new List<Case>() 
        {
            new Case(){ Year = 2001, Agency = "Agency1", Attorney="Atticus Finch", CaseNumber = 1},
            new Case(){ Year = 2001, Agency = "Agency1", Attorney="Atticus Finch", CaseNumber = 2},
            new Case(){ Year = 2001, Agency = "Agency1", Attorney="Ben Matlock", CaseNumber = 3},
            new Case(){ Year = 2002, Agency = "Agency1", Attorney="Atticus Finch", CaseNumber = 99},
            new Case(){ Year = 2002, Agency = "Agency1", Attorney="Ben Matlock", CaseNumber = 22},
            new Case(){ Year = 2002, Agency = "Agency2", Attorney="Johnny Cochran", CaseNumber = 12},
            new Case(){ Year = 2003, Agency = "Agency2", Attorney="Mark Geragos", CaseNumber = 14},
            new Case(){ Year = 2003, Agency = "Agency3", Attorney="Robert Shapiro", CaseNumber = 29}
        };

public class Case {

    public int CaseNumber { get; set; }
    public int Year { get; set; }
    public string Agency { get; set; }
    public string Attorney { get; set; }

}

您可以使用Linq進行一些分組。

var caseList = from c in Cases
                   group c by new { c.Year } into yrgrp
                   orderby yrgrp.Key.Year
                   select new
                   {
                       Year = yrgrp.Key.Year,
                       Agencies = from d in yrgrp
                                  group d by new { d.Agency} into agencygrp
                                  select new
                                  {
                                      Agency = agencygrp.Key.Agency,
                                      Total = agencygrp.Count(),
                                      Attorneys = from e in agencygrp
                                                  group e by e.Attorney into attorneygrp
                                                  select new 
                                                  {
                                                     Attorney = attorneygrp.Key,
                                                     Cases = attorneygrp,
                                                     Total = attorneygrp.Count()

                                                  }

                                  }
                   };

我承認這看起來並不漂亮。

然后,您可以遍歷新列表,並將其輸出到表中,或者在我的示例中僅輸出到控制台。

foreach (var item in caseList)
    {
        Console.WriteLine(item.Year);
        foreach (var agency in item.Agencies)
        {
            Console.WriteLine( agency.Agency + " Number Cases:" + agency.Total + " Number Attorneys:" + agency.Attorneys.Count());

            foreach (var attorney in agency.Attorneys)
            {
                Console.WriteLine(attorney.Attorney + " Number Cases: " + attorney.Total );

                foreach (var cases in attorney.Cases)
                {
                    Console.WriteLine("Case #" + cases.CaseNumber);
                }
            }

        }
    }
        Console.ReadKey();

    }

輸出..

2001
Agency1 Number Cases:3 Number Attorneys:2
Atticus Finch Number Cases: 2
Case #1
Case #2
Ben Matlock Number Cases: 1
Case #3
2002
Agency1 Number Cases:2 Number Attorneys:2
Atticus Finch Number Cases: 1
Case #99
Ben Matlock Number Cases: 1
Case #22
Agency2 Number Cases:1 Number Attorneys:1
Johnny Cochran Number Cases: 1
Case #12
2003
Agency2 Number Cases:1 Number Attorneys:1
Mark Geragos Number Cases: 1
Case #14
Agency3 Number Cases:1 Number Attorneys:1
Robert Shapiro Number Cases: 1
Case #29

根據我在網上可以找到的信息,ASP無法鏡像此功能。 可能有一個最新版本可以,但是我找不到任何相關信息。

在沒有此功能的語言中,這是復制它的一種方法。 (雖然不是很漂亮,但是每種語言都有其優點和缺點。) 這是部分偽代碼,因此無法像任何語言一樣正常工作。

var cYear = "";
var cAgency = "":
var cAtt = "";
[output loop] {
    if (cYear != GetRecords.Year) {
        // output tr showing GetRecords.Year
        cYear = GetRecords.Year;
        cAgency = ""; // Set these to blank in case the next row starts with thee same as the last finishes with. Otherwise the display would be screwed up.
        cAtt = "";
    } 
    if (cAgency != GetRecords.Agency) {
        // output tr showing GetRecords.Agency
        cAgency = GetRecords.Agency;
        cAtt = "";
    }
    if (cAtt != GetRecords.Attorney} {
        cAtt = GetRecords.Attorney;
        // output tr showing GetRecords.Attorney.
    }

    //output the data row
}

每一層都重置與下一層相關的值,這樣,如果最后一個父組的最后一行與代理或律師匹配,則不會破壞顯示。

至於要對組進行計數,可以在查詢中使用子查詢上的count()來獲得所需的計數。 即使在CF中,這種簡單的計數也很容易(就所需的代碼量而言),最好在代碼側進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM