使用Linq作为rdlc报表的数据源

本文介绍了使用Linq填充报表的过程,包括准备工作、制作报表、准备数据源及后台代码等环节,并探讨了Linq相较于传统DataSet的优缺点。

平时做报表大都使用ADO.NET填充数据集来处理,今天尝试了下用Linq来做,也很方便,不过稍微费了一番周折。

示例代码下载

 

一、准备工作

1、Northwind数据库

2、开发环境:VS2008 + SQL Server 2008

3、本测试采用网页形式,WinForm大同小异,感兴趣的朋友可以自己测试下

 

二、制作报表

  这次先用rdlc测试,下次改用水晶报表试试。报表的布局还是很简单的,由于是测试,只放了很少的控件:

核心控件是一个Table,添加了三列,页眉放置了一个Label,为了便于查询,报表添加了一个参数:p_Country,当用户选择后可以即时查询信息。

 

三、准备数据源

这一步是关键,经典的DataSet拖拽方式早已经深入人心,通过Server Explorer拖拽几个表过来,再从Website Data Source中拖拽相应的字段,就好了。但是Linq呢?你会发现Website Data Source中除了三个节点外空空如也:

根本就没有我们所需要的字段,又怎么拖拽呢?我查找了一些资料,发现用存储过程是可以的,首先定义好存储过程,在数据库中执行,然后更新Northwind.dbml文件,将新创建的存储过程拖拽到方法栏中:

然后 Ctrl + Shift + S 全部保存,再打开报表时就能发现需要的字段了:

下面就是熟悉的步骤:拖拽、居中对齐、加粗...

 

四、后台代码

前台准备工作完成后,剩下的工作就轻松多了。在WebForm上放置了一个ReportViewer控件,用来呈现报表,同时有一个DropDownList供用户选择:

 

初始化DropDownList的数据源,查询出Customers表中的所有Country(去除重复值):

ExpandedBlockStart.gif 代码
     private   void  fnDataIni()
    {
        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);
        }
    }

 

 

最后一步:构造数据源,传递参数,刷新报表

ExpandedBlockStart.gif 代码
     private   void  fnBuildDataSource( string  v_strCountry)
    {
        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();
    }

 

 

最终效果图如下:

 

小结:

  用Linq做数据源虽然可以实现,但是相对于传统的DataSet,其效率值得考虑,尤其当数据量很大时,报表的反应速度尤其重要,现在微软对Linq做数据源的支持还不够“官方”,期待VS2010中有何新特性吧!

本次我也留下了一些疑问:

1、不用存储过程(或视图)是否可行呢?

2、能否从后台编程获取RDLC的控件实例?

3、能否操作RDL语言来嵌入Linq呢?

4、如果Linq返回了匿名类型该如何拖拽呢?

转载于:https://www.cnblogs.com/brooks-dotnet/archive/2010/01/25/1656313.html

### RDLC 报表使用指南 #### 定义与概述 RDLC (Report Definition Language Client-side) 文件是一种 XML 文件,用于定义本地模式报表的布局和数据源连接方式。这些文件允许开发者创建复杂的报表而不需要访问远程 SQL Server Reporting Services(SSRS)[^1]。 #### 创建 RDLC 报表的基础流程 为了在应用程序中集成 RDLC 报表,通常遵循如下工作流: - **设计报表模板** 设计阶段涉及通过 Visual Studio 或其他支持工具建立报表的设计稿。这一步骤包括设置页面大小、边距以及放置各种控件如表格、图表等。 - **配置数据集** 数据集是从数据库或其他数据存储获取的数据集合体。可以利用 LINQ to SQL, Entity Framework 等 ORM 工具简化此过程。一旦准备好数据模型,则需将其绑定到报表中的相应字段上。 - **部署与呈现** 当完成上述两步之后,在应用内实现报表展示功能就变得简单多了。对于 ASP.NET MVC 应用程序而言,可借助 MvcReportViewer 这样的第三方组件轻松实现在浏览器端查看由 RDLC 渲染出来的 HTML 页面效果。 ```csharp // 示例代码:加载并显示RDLC报表 public ActionResult ShowReport() { LocalReport localReport = new LocalReport(); string reportPath = Path.Combine(Server.MapPath("~/Reports"), "SalesSummary.rdlc"); // 设置报表路径 localReport.ReportPath = reportPath; // 添加数据源 var salesData = GetSalesData(); // 假设这是获取销售数据的方法 ReportDataSource dataSource = new ReportDataSource("DataSet_Sales", salesData); localReport.DataSources.Add(dataSource); // 导出为字节数组以便于进一步处理或直接返回给客户端 byte[] renderedBytes = localReport.Render( format: "HTML4.0", deviceInfo: null, createStreamCallback: CreateStream, out warnings: out Warning[] warnings, out streamIds: out string[] streamIds); return File(renderedBytes, "text/html"); } ``` #### 高级特性探索 除了基本的功能外,RDLC 报表还提供了丰富的样式定制选项和支持多种类型的可视化元素(例如条形码、QR Code)。此外,还可以编写表达式来进行条件格式化操作或是计算汇总统计信息等复杂业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值