【问题标题】:Using Linq to SQL and Sql Reporting Services使用 Linq to SQL 和 Sql Reporting Services
【发布时间】:2009-01-20 14:51:10
【问题描述】:

我有一个关于集成使用 Linq To Sql 开发的业务对象进行数据查询以及与 Sql Server Reporting Services 集成的问题。

我们有一组业务对象,用于查询使用 Linq to SQL 开发的几个后端数据库。生成的 SQL 是相对动态的(基于用户选择的条件)并且涉及多个连接,一些内部连接,一些外部连接等。Linq to SQL 非常适合这个。但是,当我们在最初推出后尝试使用 SQL Reporting Services 实现报告时遇到了问题。我们没有能力将 SSRS 报告绑定到我们的业务层。我们基本上最终做的是获取从 SQL Profiler 执行的 SQL 并创建存储过程,并在报告中使用存储过程。可以想象,当我们维护代码时,这成为了一个问题,需要更新我们的业务层和存储过程。

我做了一些查看,发现自定义数据扩展似乎是一种方法。这是解决问题的方法吗?有没有人有更好的方法?有没有使用 LINQ 实现这样的解决方案的示例?

http://www.devx.com/dbzone/Article/31336

谢谢

【问题讨论】:

    标签: linq-to-sql reporting-services


    【解决方案1】:

    顺便说一句,你不需要使用 Profiler 来查看生成的 SQL。

    var 查询 = ( 来自 db.Customers 中的 c 其中 c.LastName = "某人" 选择 c );

    //输出查询SQL Debug.WriteLine(query);

    返回查询.ToList();

    另外,我们所做的是挂钩到 DataContext 的 Log 属性。每次我们访问数据库时,它都会自动写出我们的 SQL 和参数。我们发现这对于识别不必要的数据库调用非常有用。

    public class DataBase : DataBaseModelDataContext
    {
        internal DataBase()
        {
        }
    
        public DataBase(CommonObjects.BaseParameters param) {
            #If (DEBUG) 
            Log = new DataBaseLoger();
            #endIf //(DEBUG) 
        }
    
        public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
        {   
            System.Data.Linq.ChangeSet cs = GetChangeSet();
    
            // update audit fields for each insert
            foreach (object entity in cs.Inserts)
            {
                UpdateAuditFields(entity);                               
            }
    
            // update audit fields for each update
            foreach (object entity in cs.Updates)
            {
                UpdateAuditFields(entity);
            }
    
            base.SubmitChanges(failureMode);
        }
    }
    

    公共类DataBaseLoger:System.IO.TextWriter { 公共覆盖编码编码 { 获取 { 返回新的 System.Text.UTF8Encoding(); } }

        public override void WriteLine(string value)
        {
            System.Diagnostics.Trace.WriteLine(System.DateTime.Now.ToString("hh:mm:ss") + " " + value, "Information");
        }
    
        public override void WriteLine()
        {
            System.Diagnostics.Trace.WriteLine("", "Information");            
        }
    
        public override void WriteLine(string format, params object[] arg)
        {
            WriteLine(string.Format(format, arg));
        }
    }
    

    【讨论】:

    • 谢谢。我们有一个“报告作者”类型的角色,它是一个 SQL 类型的人,而不是编码人员,所以这是他们接触 SQL 的最简单途径。不过,我真的很喜欢连接到 DataContext 的 Log 属性的想法。谢谢!
    【解决方案2】:

    在本地模式下使用 ReportViewer 控件,针对 ObjectDataSource,后者又使用带有“Get”方法的简单类,每个都返回 IEnumerable<ClassNeededForReport>

    执行上述操作的示例(减去 Linq):http://msdn.microsoft.com/en-us/library/ms251692(VS.80).aspx

    只需编写“Get”方法来使用 Linq,如果需要,还可以选择执行 .ToList()。

    【讨论】:

    • 这帮了大忙,不幸的是它似乎与客户端报告(RDLC)有关。我很想让报告与服务器端报告(RDC 文件)一起使用。如果我能够确定发生了什么,我会提供更多信息。
    【解决方案3】:

    只是想稍微结束一下这个循环......

    我们已经通过 LINQ to SQL 应用程序实现了这一点,但它也应该与 EF 一起正常工作。

    基本上,它已在上面列出的 devx 文章中列出。

    http://www.devx.com/dbzone/Article/31336

    我们遇到了几件事,其中之一是需要“扁平化”我们的数据。我们有自定义例程来将数据扁平化为可供 SSRS 报告使用的行集。您还需要注意上述文章中的设置说明。

    提醒一下,我们需要在实现中使用 SSRS 的 Web Service 功能。如果您可以使用本地报告,那就容易多了。如果您对使用域模型的本地报告感兴趣,这是我刚刚遇到的一个很好的系列,它使用 nHibernate 和 SSRS。

    http://codebetter.com/blogs/peter.van.ooijen/archive/2009/07/01/reporting-against-a-domain-model.aspx

    http://codebetter.com/blogs/peter.van.ooijen/archive/2009/07/08/domain-driven-reports-adding-custom-code.aspx

    约翰

    【讨论】:

    • 您指向 Peter van Ooijen 文章的链接非常适合这种情况。我单独使用这两篇​​文章解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多