2009-01-20 72 views
10

我对使用Linq To Sql开发的业务对象的集成进行数据查询和与Sql Server Reporting Services集成有一个疑问。使用Linq to SQL和Sql Reporting Services

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

我已经做了一些观察,我看到自定义数据扩展似乎是一种方法来做到这一点。这是解决问题的办法吗?有没有人有更好的方法?有没有使用LINQ实现这种解决方案的例子?

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

感谢

回答

1

只是想关闭这个循环有点...

我们已经通过一个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

约翰

+0

您与Peter van Ooijen的文章的链接非常适合这种情况。我单独使用这两篇​​文章解决了我的问题。 – 2013-06-24 08:43:18

4

BTW,你不需要使用Profiler来查看生成的SQL。

VAR查询=( 从C在db.Customers 其中c.LastName = “有人” 选择C );

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

返回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)); 
    } 
} 
+0

感谢。我们有一个“报告编写者”类型的角色,与编码人员相比,他是一个SQL类型的人员,因此这是他们访问SQL的最简单途径。 虽然我真的很喜欢挂钩DataContext的Log属性的想法。谢谢! – 2009-02-18 14:31:14

4

使用ReportViewer控件在本地模式下,对一个ObjectDataSource又使用一个简单的类以“获取”的方法,每区选出IEnumerable<ClassNeededForReport>

样品做上述(减去LINQ):http://msdn.microsoft.com/en-us/library/ms251692(VS.80).aspx

只写你的 “获取” 方法使用Linq,可选做的,如果需要.ToList()。

+0

这帮了很多,不幸的是它似乎与客户端报告(RDLC)有关。我打算让报告与服务器端报告(RDC文件)一起使用。如果我能够确定发生了什么,我会提供更多信息。 – 2009-05-13 22:50:34