2009-01-20 42 views
10

Tôi có một câu hỏi liên quan đến việc tích hợp các đối tượng nghiệp vụ được phát triển bằng cách sử dụng LINQ to Sql để truy vấn dữ liệu và tích hợp với Sql Server Reporting Services.Sử dụng LINQ to SQL và Sql Reporting Services

Chúng tôi có một bộ đối tượng nghiệp vụ truy vấn một vài cơ sở dữ liệu phía sau được phát triển với LINQ to SQL. SQL được tạo ra là tương đối năng động (dựa trên các điều kiện mà người dùng chọn) và liên quan đến nhiều phép nối, một số bên trong, một số bên ngoài, vv LINQ to SQL làm việc rất tốt cho việc này. Tuy nhiên, chúng tôi gặp phải sự cố khi chúng tôi cố triển khai báo cáo với Dịch vụ báo cáo SQL sau khi triển khai ban đầu. Chúng tôi không có khả năng liên kết các báo cáo SSRS với lớp kinh doanh của chúng tôi. Những gì chúng tôi về cơ bản cuối cùng đã làm là nhận được SQL được thực thi từ SQL Profiler và tạo các thủ tục được lưu trữ, và sử dụng các thủ tục được lưu trữ trong các báo cáo. Như người ta có thể tưởng tượng, điều này đã trở thành một vấn đề khi chúng tôi duy trì mã, cần phải cập nhật cả hai lớp kinh doanh của chúng tôi và các thủ tục được lưu trữ.

Tôi đã thực hiện một số giao diện và tôi thấy rằng Tiện ích dữ liệu tùy chỉnh dường như là một cách tiếp cận để thực hiện việc này. Đây có phải là giải pháp cho vấn đề không? Có ai có cách tiếp cận tốt hơn không? Có bất kỳ ví dụ về việc thực hiện một giải pháp như thế này bằng cách sử dụng LINQ?

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

Cảm ơn

Trả lời

1

Chỉ muốn đóng vòng lặp này một chút ...

Chúng tôi đã làm việc thông qua việc triển khai thực hiện điều này với ứng dụng LINQ to SQL, nhưng nó cũng hoạt động tốt với EF.

Về cơ bản, nó được trình bày trong bài viết devx được liệt kê ở trên.

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

Có một số điều mà chúng tôi chạy vào, một trong số đó là sự cần thiết để "san bằng" Dữ liệu của chúng tôi. Chúng tôi có thói quen tùy chỉnh để san bằng dữ liệu vào một tập hợp hàng có thể được tiêu thụ bởi các báo cáo SSRS. Bạn cũng cần phải chú ý đến các hướng dẫn cài đặt trong bài viết ở trên.

Chỉ cần nhắc nhở, chúng tôi cần sử dụng chức năng Dịch vụ web của SSRS trong quá trình triển khai. Nếu bạn có thể sử dụng các báo cáo địa phương, nó dễ dàng hơn nhiều. Nếu bạn quan tâm đến báo cáo địa phương với mô hình miền của bạn, đây là một loạt tốt tôi chỉ chạy trên đó sử dụng nHibernate với 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

John

+0

Các liên kết của bạn đến bài viết của Peter van Ooijen là hoàn hảo cho kịch bản này. Tôi đã giải quyết vấn đề của mình bằng cách sử dụng 2 bài viết này một mình. –

4

BTW, bạn không cần phải sử dụng Profiler để xem SQL được tạo ra.

var query = ( từ c trong db.Customers nơi c.LastName = "Ai đó" chọn c );

// xuất truy vấn SQL Debug.WriteLine (truy vấn);

Trả lời truy vấn.ToList();

Ngoài ra, những gì chúng tôi đã làm là móc vào thuộc tính Nhật ký của DataContext. Điều này tự động viết ra các tham số và SQL của chúng ta mỗi khi chúng ta nhấn vào cơ sở dữ liệu. Chúng tôi thấy điều này rất hữu ích để xác định các cuộc gọi cơ sở dữ liệu không cần thiết.

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); 
    } 
} 

public class DataBaseLoger: System.IO.TextWriter { public override Encoding Encoding { get {return System.Text.UTF8Encoding mới(); }}

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

Cảm ơn. Chúng tôi đã có vai trò loại "nhà văn báo cáo" là một người kiểu SQL như trái ngược với coder, vì vậy đó là con đường dễ nhất để họ truy cập vào SQL. Tôi thực sự thích ý tưởng móc nối vào thuộc tính Nhật ký của DataContext. Cảm ơn! –

4

Sử dụng kiểm soát ReportViewer trong chế độ địa phương, chống lại một ObjectDataSource do đó sử dụng một lớp đơn giản với "Get" phương pháp, từng trở IEnumerable<ClassNeededForReport>.

mẫu thực hiện ở trên (trừ LINQ): http://msdn.microsoft.com/en-us/library/ms251692(VS.80).aspx

Chỉ cần viết "Nhận" phương pháp của bạn để sử dụng LINQ, tùy chọn làm một ToList() nếu cần.

+0

Điều này đã giúp rất nhiều, unfortunatley nó dường như có liên quan đến báo cáo phía khách hàng (RDLC). Tôi buộc phải báo cáo để làm việc với các báo cáo phía máy chủ (tệp RDC). Tôi sẽ cung cấp thêm một số thông tin nếu tôi có thể xác định những gì đang xảy ra. –