2009-01-20 59 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