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
Dzięki za sugestię, mam to działa teraz na tej podstawie. – Michael
@ Michael Cieszę się, że słyszę :) –