2009-01-20 27 views
10

Tengo una pregunta sobre la integración de objetos comerciales desarrollados utilizando Linq To Sql para consulta de datos e integración con Sql Server Reporting Services.Uso de Linq a SQL y Sql Reporting Services

Tenemos un conjunto de objetos comerciales que consultan un par de bases de datos de back-end que se desarrollan con Linq a SQL. El SQL que se genera es relativamente dinámico (según las condiciones que el usuario selecciona) e implica varias combinaciones, algunas internas, otras externas, etc. Linq to SQL funcionó muy bien para esto. Sin embargo, nos encontramos con problemas cuando intentamos implementar informes con SQL Reporting Services después de la implementación inicial. No pudimos vincular los informes de SSRS a nuestra capa de negocios. Lo que esencialmente terminamos haciendo es obtener el SQL que se ejecuta desde el Analizador de SQL y crear procedimientos almacenados, y usar los procedimientos almacenados en los informes. Como se puede imaginar, esto se convirtió en un problema ya que mantuvimos el código y tuvimos que actualizar tanto nuestra capa comercial como el procedimiento almacenado.

He hecho algunas búsquedas y veo que las extensiones de datos personalizados parecen ser un enfoque para hacer esto. ¿Es esta la solución al problema? ¿Alguien tiene un mejor enfoque? ¿Hay algún ejemplo de implementar una solución como esta usando LINQ?

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

Gracias

Respuesta

1

Sólo quería cerrar el círculo en esto un poco ...

Hemos trabajado en la implementación de esto con una aplicación LINQ to SQL, pero debería funcionar bien con EF también.

Esencialmente, se presenta en el artículo devx mencionado anteriormente.

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

hay varias cosas que nos encontramos, una de las cuales es la necesidad de "aplanar" nuestros datos. Tenemos rutinas personalizadas para aplanar los datos en un conjunto de filas que pueden ser consumidos por los informes de SSRS. También deberá prestar atención a las instrucciones de configuración en el artículo anterior.

Solo un recordatorio, tenemos que usar las funciones del servicio web de SSRS en nuestra implementación. Si puede utilizar los informes locales, es mucho más fácil. Si está interesado en informes locales con su modelo de dominio, aquí hay una buena serie con la que me topé y que usa nHibernate con 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

Sus enlaces a los artículos de Peter van Ooijen son perfectos para este escenario. Resolví mi problema usando solo estos 2 artículos. –

4

Por cierto, no es necesario utilizar Profiler para ver el SQL generado.

consulta var = ( de c en db.Customers donde c.LastName = "Alguien" seleccione c );

// salida la consulta SQL Debug.WriteLine (consulta);

Return query.ToList();

Como alternativa, lo que hicimos fue conectarnos a la propiedad de registro de DataContext. Esto escribe nuestro SQL y parámetros automáticamente cada vez que golpeamos la base de datos. Hemos encontrado esto muy útil para identificar llamadas innecesarias a la base de datos.

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 clase pública: System.IO.TextWriter { public override Codificación Codificación {get {return nueva 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

Gracias. Teníamos un rol de tipo "escritor de informes" que era una persona de tipo SQL en lugar de un codificador, por lo que era la forma más fácil de acceder al SQL. Aunque me gusta mucho la idea de conectarme a la propiedad de registro de DataContext. ¡Gracias! –

4

Usar el control ReportViewer en modo local, contra un ObjectDataSource que a su vez utiliza una clase simple con métodos "get", cada uno de regresar IEnumerable<ClassNeededForReport>.

Muestra de hacer lo anterior (menos LINQ): http://msdn.microsoft.com/en-us/library/ms251692(VS.80).aspx

Sólo tiene que escribir su método de "Get" para utilizar LINQ, opcionalmente haciendo un .ToList() si es necesario.

+0

Esto ayudó mucho, desafortunadamente parece estar relacionado con los informes del lado del cliente (RDLC). Estoy enviando un tyring para que los informes funcionen con los informes del lado del servidor (archivos RDC). Proporcionaré más información si puedo determinar lo que está sucediendo. –

Cuestiones relacionadas