使用Linq作為rdlc報(bào)表的數(shù)據(jù)源
平時(shí)做報(bào)表大都使用ADO.NET填充數(shù)據(jù)集來(lái)處理,今天嘗試了下用Linq來(lái)做,也很方便,不過(guò)稍微費(fèi)了一番周折。
一、準(zhǔn)備工作
1、Northwind數(shù)據(jù)庫(kù)
2、開(kāi)發(fā)環(huán)境:VS2008 + SQL Server 2008
3、本測(cè)試采用網(wǎng)頁(yè)形式,WinForm大同小異,感興趣的朋友可以自己測(cè)試下
二、制作報(bào)表
這次先用rdlc測(cè)試,下次改用水晶報(bào)表試試。報(bào)表的布局還是很簡(jiǎn)單的,由于是測(cè)試,只放了很少的控件:

核心控件是一個(gè)Table,添加了三列,頁(yè)眉放置了一個(gè)Label,為了便于查詢,報(bào)表添加了一個(gè)參數(shù):p_Country,當(dāng)用戶選擇后可以即時(shí)查詢信息。
三、準(zhǔn)備數(shù)據(jù)源
這一步是關(guān)鍵,經(jīng)典的DataSet拖拽方式早已經(jīng)深入人心,通過(guò)Server Explorer拖拽幾個(gè)表過(guò)來(lái),再?gòu)腤ebsite Data Source中拖拽相應(yīng)的字段,就好了。但是Linq呢?你會(huì)發(fā)現(xiàn)Website Data Source中除了三個(gè)節(jié)點(diǎn)外空空如也:

根本就沒(méi)有我們所需要的字段,又怎么拖拽呢?我查找了一些資料,發(fā)現(xiàn)用存儲(chǔ)過(guò)程是可以的,首先定義好存儲(chǔ)過(guò)程,在數(shù)據(jù)庫(kù)中執(zhí)行,然后更新Northwind.dbml文件,將新創(chuàng)建的存儲(chǔ)過(guò)程拖拽到方法欄中:

然后 Ctrl + Shift + S 全部保存,再打開(kāi)報(bào)表時(shí)就能發(fā)現(xiàn)需要的字段了:

下面就是熟悉的步驟:拖拽、居中對(duì)齊、加粗...
四、后臺(tái)代碼
前臺(tái)準(zhǔn)備工作完成后,剩下的工作就輕松多了。在WebForm上放置了一個(gè)ReportViewer控件,用來(lái)呈現(xiàn)報(bào)表,同時(shí)有一個(gè)DropDownList供用戶選擇:

初始化DropDownList的數(shù)據(jù)源,查詢出Customers表中的所有Country(去除重復(fù)值):
代碼
{
NorthwindDataContext ctx = new NorthwindDataContext();
var result = from c in ctx.Customers
select c.Country;
foreach (string list in result.Distinct<string>().ToList<string>())
{
this.ddlCountry.Items.Add(list);
}
}
最后一步:構(gòu)造數(shù)據(jù)源,傳遞參數(shù),刷新報(bào)表
代碼
{
NorthwindDataContext ctx = new NorthwindDataContext();
var datasource = from c in ctx.sp_LinqTest(v_strCountry)
orderby c.CustomerID
select c;
ReportParameter rpCountry = new ReportParameter("p_Country", v_strCountry);
this.rvNorthwind.LocalReport.SetParameters(new ReportParameter[] { rpCountry });
this.rvNorthwind.LocalReport.DataSources.Add(new ReportDataSource("sp_LinqTestResult", datasource.ToList()));
this.rvNorthwind.LocalReport.Refresh();
}
最終效果圖如下:

小結(jié):
用Linq做數(shù)據(jù)源雖然可以實(shí)現(xiàn),但是相對(duì)于傳統(tǒng)的DataSet,其效率值得考慮,尤其當(dāng)數(shù)據(jù)量很大時(shí),報(bào)表的反應(yīng)速度尤其重要,現(xiàn)在微軟對(duì)Linq做數(shù)據(jù)源的支持還不夠“官方”,期待VS2010中有何新特性吧!
本次我也留下了一些疑問(wèn):
1、不用存儲(chǔ)過(guò)程(或視圖)是否可行呢?
2、能否從后臺(tái)編程獲取RDLC的控件實(shí)例?
3、能否操作RDL語(yǔ)言來(lái)嵌入Linq呢?
4、如果Linq返回了匿名類型該如何拖拽呢?


浙公網(wǎng)安備 33010602011771號(hào)