2012-05-29 4 views
5

にLINQを介して可変列の長さを返すことができます私は、インターネットラウンド検索を持っていたし、直接私が後だものと一致する何かを見つけることができません....がどのようにSQL

私は返すストアドプロシージャを持っています(ColumnA、ColumnB、ColumnCと言う)を追加し、追加の列(おそらくColumnD、ColumnEとColumnF、またはColumnF、ColumnP、ColumnT、ColumnW)の不確定な数/署名を返します。

クエリの動的部分は、Idパラメータによってprocに決定されます。

残念ながら、私はスキーマを制御することができず、追加のテーブルを持たずに非常に多くの無関係の列を最後に追加して(そしてそれらを追加し続ける)ように設計されていません。これを効果的に保管してください。

結果として、コンパイル時に確定した列のセットを返すことができないため、LINQ to SQLはストアドプロシージャの戻り値の型を判別できません。

他にもオプションがありますか、これを回避する方法はありますか?ここでは、私が下でやっていることの例を挙げます。 LINQ to SQLで動作するようにこれを書き直すことはできますか?私はC#とSQL Server 2008を使ってアプリケーションを作成しています。

ありがとうございました。

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 

答えて

6

あなただけDataSetを埋めるSQL Data Adapterを使用することができませんか?あなたはその後、DataSetにLINQを使用し、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

おかげで、私はそれに基づいて、今取り組んでそれを持っています。 – Michael

+0

@Michaelは聞いてうれしいです:) –