[英]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> </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> </td>
<td> </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"> <br> </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.