Использование служб Linq to SQL и Sql Reporting Services

У меня есть вопрос об интеграции бизнес-объектов, разработанных с использованием Linq To Sql для запроса данных и интеграции с Sql Server Reporting Services.

У нас есть набор бизнес-объектов, которые запрашивают пару базовых баз данных, разработанных с Linq to SQL. SQL, который генерируется, является относительно динамичным (на основе условий, выбранных пользователем) и включает в себя несколько объединений, некоторые внутренние, некоторые внешние и т.д. Linq to SQL отлично справился с этим. Однако мы столкнулись с проблемами, когда пытались внедрить отчеты с SQL Reporting Services после первоначального развертывания. У нас не было возможности привязывать отчеты SSRS к нашему бизнес-уровню. То, что мы в основном закончили, - это получение SQL, который выполняется из SQL Profiler и создание хранимых процедур, а также использование хранимых процедур в отчетах. Как можно себе представить, это стало проблемой, поскольку мы поддерживали код, нуждаясь в обновлении как нашего бизнес-уровня, так и хранимой процедуры.

Я сделал некоторые взгляды, и я вижу, что Custom Data Extensions, как представляется, подходят для этого. Это решение проблемы? У кого-то есть лучший подход? Есть ли какой-нибудь пример реализации такого решения, используя LINQ?

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

Спасибо

Ответ 1

Просто хотел немного закрыть цикл...

Мы работали над реализацией этого с помощью приложения LINQ to SQL, но он также должен отлично работать с EF.

По существу, он изложен в статье devx, приведенной выше.

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

Есть несколько вещей, с которыми мы столкнулись, одна из которых - необходимость "сглаживания" наших данных. У нас есть настраиваемые подпрограммы, чтобы сгладить данные в наборе строк, которые могут быть использованы отчетами SSRS. Вам также нужно будет обратить внимание на инструкции по установке в приведенной выше статье.

Напоминаем, что в нашей реализации мы должны использовать функции веб-службы SSRS. Если вы можете использовать локальные отчеты, это намного проще. Если вас интересуют локальные отчеты с вашей моделью домена, вот хорошая серия, с которой я просто столкнулся, которая использует 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

Джон

Ответ 2

BTW, вам не нужно использовать Profiler для просмотра сгенерированного SQL.

var query = (    от c в db.Customers    где 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     {         Кодирование кодировки общего доступа         {             get {return new 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));
    }
}

Ответ 3

Используйте элемент управления ReportViewer в локальном режиме, против ObjectDataSource, который, в свою очередь, использует простой класс с методами "Get", каждый из которых возвращает IEnumerable<ClassNeededForReport>.

Пример выполнения вышеуказанного (минус Linq): http://msdn.microsoft.com/en-us/library/ms251692(VS.80).aspx

Просто напишите свой метод Get, чтобы использовать Linq, при необходимости сделав .ToList(), если это необходимо.