2012-05-29 4 views
5

que he tenido una búsqueda alrededor de la Internet y no se puede encontrar nada que coincida directamente lo que busco ....¿Cómo puedo volver longitudes de columna a través de variables de LINQ to SQL

Tengo un procedimiento almacenado que devuelve un conjunto fijo de columnas (digamos ColumnA, ColumnB y ColumnC) y luego devuelve un número indeterminado/firma de columnas adicionales (tal vez ColumnD, ColumnE y ColumnF, o ColumnF, ColumnP, ColumnT y ColumnW).

La parte dinámica de la consulta está determinada por un Id param del proc.

Lamentablemente no tengo el control del esquema y ha sido mal diseñado para tener un gran número de columnas no relacionadas agregadas al final (y las siguen agregando), en lugar de tener una tabla adicional para almacenar esto de manera efectiva.

Como resultado, no puedo devolver un conjunto determinado de columnas en tiempo de compilación, por lo que LINQ to SQL no puede determinar el tipo de devolución del procedimiento almacenado.

¿Tengo otras opciones o formas de evitar esto? Aquí hay un ejemplo de lo que estoy haciendo a continuación. ¿Puedo volver a escribir esto para trabajar con LINQ to SQL? Estoy escribiendo la aplicación con C# y SQL Server 2008 si eso ayuda.

Gracias.

CREATE PROCEDURE [Foo].[GetBar] 
(
    @Id INT, 
    @FooVar VARCHAR(50), 
    @BarVar DATE 
) 

AS 
BEGIN 

CREATE TABLE #TempTbl 
(  
    [ColumnName] VARCHAR(50) 
) 

INSERT #TempTbl EXEC [Foo].GetColumnNames @Id 
DECLARE @ColumnNameList NVARCHAR(max) 
SET @ColumnNameList = '' 
SELECT @ColumnNameList = COALESCE(@ColumnNameList + '],[', '') + ColumnName FROM #TempTbl 
DROP TABLE #TempTbl 
SELECT @ColumnNameList = @ColumnNameList + ']' 
SELECT @ColumnNameList = SUBSTRING(@ColumnNameList, 3, LEN(@ColumnNameList)) 

DECLARE @FixedColumns VARCHAR(200) 
DECLARE @SelectQuery NVARCHAR(max) 
DECLARE @WhereQuery VARCHAR (100) 
DECLARE @FullQuery NVARCHAR(max) 
DECLARE @ParamaterDef nvarchar (100) 
DECLARE @Foo VARCHAR(50) 
DECLARE @Bar DATE 

SET @FixedColumns = N'[ColumnA], [ColumnB], [ColumnC], ' 
SET @SelectQuery = N'SELECT ' + @FixedColumns + @ColumnNameList + N' FROM [Foo].[FooBar] ' 
SET @WhereQuery = N'WHERE [Foo] = @Foo AND [Bar] = @Bar' 
SET @FullQuery = @SelectQuery + @WhereQuery 
SET @ParamaterDef = N'@Foo VARCHAR(50), @Bar DATE' 

EXECUTE sp_executesql @FullQuery, @ParamaterDef, @Foo = @FooVar, @Bar = @BarVar 

END 

Respuesta

6

¿Puede usted no sólo tiene que utilizar un SQL Data Adapter que llena un DataSet? A continuación, puede utilizar LINQ al conjunto de datos y realizar todas sus operaciones LINQ:

DataTable yourDataTable = ds.Tables["TableName"]; 

var query = 
    from yourDataTable in yourDataTable.AsEnumerable() 
    select new 
    { 
     NewField = yourDataTable.Field<int>("ColumnName"), 
     NewField2 = yourDataTable.Field<string>("ColumnName2"), 
    }; 

MSDN (LINQ to DataSet)

MSDN (Single table queries using LINQ to DataSet

+1

Gracias por su sugerencia, he tengo trabajo ahora se basa en eso. – Michael

+0

@Michael me alegra oír :) –