2010-07-06 8 views
8

¿Alguien sabe si es posible (y cómo) utilizar LINQ en una DataTable dentro de un procedimiento almacenado de CLR?LINQ en una tabla de datos en un procedimiento almacenado CLR

No tengo problemas para usar LINQ en una DataTable en un programa WinForms estándar; Estoy usando una base de datos de proyectos en VS2010 en SQL2005 y la creación de un procedimiento almacenado:

(lista simplificado)

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void ProcessReOrder() 
{  
    using (SqlConnection conn = new SqlConnection("context connection=true")) { 
     SqlDataAdapter adapter = new SqlDataAdapter("database.dbo.OtherSp", conn); 
     DataTable table = new DataTable("ReOrder"); 
     adapter.Fill(table); 

     var query = from t in table.AsEnumerable() 
        where t.Field<int>("Id") > 1000 select t.Field<int>("Id"); 

    etc..... 
} 

El problema es, AsEnumerable() es un método de extensión y aunque he obtuve el usando referencia a LINQ; todavía no se encuentra.

Buscando en Google, me ha llevado a creer que esto tiene que ver con el uso de una referencia de entidad LINQ (DLL) enterrada en el marco, sin embargo, como se trata de un proyecto DB, no podemos agregar referencias a ninguna DLL en el sistema; el cuadro de referencia de agregar está restringido a unos pocos conjuntos seleccionados y no hay un botón ....

Independientemente de los problemas de rendimiento, etc., no deseo que despliegue manualmente mucho ADO/T-SQL dentro de mi .NET Stored Proc; prefiero LINQ y la capacidad de mover el código a diferentes capas/Plataformas de BD. ¿Es compatible LINQ en una DataTable dentro de un Stored Proc (supongo que no) o estoy completamente fuera de la base aquí y debo codificar con T-SQL?

+0

¿Por qué simplemente no escribirías tu propio método 'AsEnumerable'? Es un juego de una sola línea: 'foreach (DataRow r en table.Rows) yield return r;' Por cierto, 'AsEnumerable' está en' System.Data.DataSetExtensions'. – mquander

+0

Si utiliza un ORM como LINQ-TO-SQL o Entity Framework, puede agregar procedimientos almacenados y llamarlos como una llamada a un método. –

+0

@mquander, sospechaba que esta sería mi única opción. Estoy tratando de no volver a codificar partes de la implementación de MS 'LINQ, sino que lo uso "tal cual", especialmente porque el código funciona sin una implícita adicional fuera de un procedimiento almacenado de CLR. Tiene razón, no es el espacio de nombres de la Entidad, sino el System.Data.DataSetExtensions (mi error), solo que no puede hacer referencia a esa DLL desde un Proyecto DB. Parece que MS solo le permitirá usar los complementos que están implementados en el Servidor SQL. Gracias. –

Respuesta

5

No estoy seguro de que esto lo lleve hasta el final, sin embargo, esto obtendrá System.Data.DataSetExtensions instalado en SQL Server 2008 para que pueda hacer referencia a él desde su proyecto SQL CLR. Tenga en cuenta que inicié sesión como miembro de la función de servidor fijo sysadmin.

Primero, tuve que preparar la base de datos para cargar el ensamblaje inseguro. Ejecuté ALTER DATABASE dbname SET TRUSTWORTHY ON; luego establecí el propietario de la base de datos en sa con ALTER AUTHORIZATION ON database::dbname TO sa;.

A continuación, extraje v3.5 del ensamblado del GAC en mi estación de trabajo copiando el archivo en un directorio de espera (por ejemplo c: \ temp) desde C: \ Windows \ assembly \ GAC_MSIL \ System.Data.DataSetExtensions \ 3.5.0.0__b77a5c561934e089.

Pude instalar el ensamblado con la instrucción CREATE ASSEMBLY [System.Data.DataSetExtensions] FROM 'C:\temp\System.Data.DataSetExtensions.dll' WITH PERMISSION_SET = UNSAFE;.

las que aparece este recordatorio cuando la declaración completa: advertencia: system.data.datasetextensions El ensamblado de Microsoft .NET Framework', versión = 3.5.0.0, Culture = neutral, publickeytoken = b77a5c561934e089, processorArchitecture = MSIL. ' que está registrando no se ha probado completamente en el entorno alojado de SQL Server y no es compatible. En el futuro, si actualiza o repara este ensamblaje o .NET Framework, su rutina de integración de CLR puede dejar de funcionar. Consulte los Libros en pantalla de SQL Server en línea para obtener más detalles.

En este punto, yo era entonces capaz de hacer referencia System.Data.DataSetExtensions en mi proyecto SQL CLR, y me confirmó que AsEnumerable() se presentaron en la instancia de DataTable.

Cuestiones relacionadas