¿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?
¿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
Si utiliza un ORM como LINQ-TO-SQL o Entity Framework, puede agregar procedimientos almacenados y llamarlos como una llamada a un método. –
@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. –