将Linq结果转换为数据表

时间:2014-04-29 03:03:57

标签: asp.net-mvc linq entity-framework datatable crystal-reports

我的流程应该使用Crystal Reports显示报告,在我的项目中,我使用.NET MVC作为我的框架和数据库模型的实体框架。

问题是我不知道如何将数据集发送到我的报告中,因为我知道水晶报告支持datatable作为他们的数据集,所以我需要将linq结果转换为datatable,这是我的代码到目前为止:

IEnumerable<DataRow> SalesContractEntity = _db.Generate_Report(202, "RGBCtestcontract2");

ReportDocument rd = new ReportDocument();
rd.Load(Server.MapPath("~/Reports/") + "ColdLineBaliHolidayClubENUSD.rpt");
rd.SetDataSource(SalesContractEntity); 
CrystalReportViewerID.ReportSource = rd;

注意:

  • 我正在使用数据集的存储过程
  • 有很多列由SP生成
  • 该代码给出了我这样的错误:

      

    System.Data.Objects.ObjectResult to   System.Collections.Generic.IEnumerable

  •   

1 个答案:

答案 0 :(得分:1)

最后我找到了解决方案

这是我的代码:

List<Generate_Report_Result> ReportList = new List<Generate_Report_Result>();
            ReportList = _db.Generate_Report(ApplicantID, ContractNumber).ToList();

            DataTable datanya = ToDataTable(ReportList);
            ReportDocument rd = new ReportDocument();
            string ThePath = Server.MapPath("~/Reports/") + ReportFileName;
            rd.Load(ThePath);
            rd.SetDataSource(datanya);
            CrystalReportViewerID.ReportSource = rd;
            CrystalReportViewerID.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
            CrystalReportViewerID.RefreshReport();

private DataTable ToDataTable(List<Generate_Report_Result> items)
        {
            var tb = new DataTable(typeof(Generate_Report_Result).Name);

            PropertyInfo[] props = typeof(Generate_Report_Result).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var prop in props)
            {
                tb.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            }

            foreach (var item in items)
            {
                var values = new object[props.Length];
                for (var i = 0; i < props.Length; i++)
                {
                    values[i] = props[i].GetValue(item, null);
                }

                tb.Rows.Add(values);
            }

            return tb;
        }

并且不要忘记在我们的项目文件夹中添加 aspnet_client (您可以从C:\ inetpub \ wwwroot复制)