しばらく前に、ピボット テーブルの作成を手伝ってもらいました。皆さんが私のためにやってきて、ピボットを作成し、結果を新しいテーブルに保存できるストアド プロシージャができました。列は動的であるため、アプリケーション内のトランザクションごとに常に異なります。
私が抱えている問題は、アプリケーションが MVC であり、Entity Framework を使用していることです。データベースはモデル化されているため、動的な列名を使用してその場でテーブルを作成することはできません。使用中、EF はそれらがそこにあることを決して認識しません。また、私のビューも認識しません。
ストアド プロシージャを、モデルの最後から処理できる LINQ ステートメントに変換する必要があるようです。
ストアド プロシージャに SQL ServerSTUFF
関数が含まれています。この関数を LINQ ステートメントで呼び出す方法がわかりません。
SQL STUFF 関数を使用した SQL の例:
DECLARE @cols AS VARCHAR(MAX),
@query AS VARCHAR(MAX);
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + convert(varchar(10), t2.date, 101)
FROM test AS t2
ORDER BY '],[' + convert(varchar(10), t2.date, 101)
FOR XML PATH('')
), 1, 2, '') + ']'
set @query = 'select name, ' + @cols + '
from
(
select name, date, cast(yesno as tinyint) as yesno
from test
) x
pivot
(
max(yesno)
for date in (' + @cols + ')
) p'
execute(@query)
MSDN には次の方法があります。
[EdmFunctionAttribute("SqlServer", "STUFF")]
public static string Stuff(
string stringInput,
Nullable<int> start,
Nullable<int> length,
string stringReplacement
)
...しかし、どこに配置し、LINQ でどのように使用するかはわかりません。
それが理にかなっていることを願っています。