2012-05-29 14 views
5

miałem przeszukiwanie okrągły internecie i nie mogę znaleźć nic, które bezpośrednio odpowiada co jestem po ....Jak mogę powrócić zmiennej długości kolumn poprzez LINQ to SQL

Mam procedurę przechowywaną, która zwraca ustalony zestaw kolumn (powiedzmy ColumnA, ColumnB i ColumnC), a następnie dodatkowo zwraca nieokreśloną liczbę/sygnaturę dodatkowych kolumn (być może ColumnD, ColumnE i ColumnF lub ColumnF, ColumnP, ColumnT i ColumnW).

Część dynamiczna zapytania jest określana przez parametr Id do proc.

Niestety nie mam kontroli nad schematem i został źle zaprojektowany, aby mieć bardzo dużą liczbę niepowiązanych kolumn dodanych do końca (i nadal dodają je), zamiast posiadania dodatkowej tabeli (tabel) do przechowuj to skutecznie.

W rezultacie nie mogę zwrócić ustalonego zestawu kolumn podczas kompilacji, więc LINQ do SQL nie może określić typu zwracanego procedury składowanej.

Czy mam jakieś inne opcje lub sposoby na obejście tego? Oto przykład tego, co robię poniżej. Czy mogę ponownie napisać to do pracy z LINQ do SQL? Piszę aplikację z C# i SQL Server 2008, jeśli to pomaga.

Dzięki.

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 

Odpowiedz

6

Nie można po prostu użyć SQL Data Adapter że wypełnia DataSet? Następnie można użyć LINQ do DataSet i wykonywania wszystkich operacji 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

Dzięki za sugestię, mam to działa teraz na tej podstawie. – Michael

+0

@ Michael Cieszę się, że słyszę :) –