動的に作成されたストアドプロシージャへのLINQからのアクセス
-
06-07-2019 - |
質問
MS SQLストアドプロシージャのデータをピボットしています。ピボットされる列は、ストアドプロシージャパラメーター(例: "location1、location2、location3、")を使用して動的に作成されるため、生成される列の数は不明です。出力は次のようになります(場所はストアドプロシージャパラメーターから取得されます):
OrderTime |ロケーション1 |ロケーション2 | Location3
これがLINQ to SQLで使用できる可能性はありますか?このプロシージャをdbmlファイルにドラッグすると、このプロシージャがint型を返すことがわかります。
log_sales
テーブルから使用する列は次のとおりです。
- 場所(私がピボットしているさまざまな場所)、
- 料金(金額)
- OrderTime
ストアドプロシージャ:
CREATE PROCEDURE [dbo].[proc_StatsDay] @columns NVARCHAR(64) AS
DECLARE @SQL_PVT1 NVARCHAR(512), @SQL_PVT2 NVARCHAR(512), @SQL_FULL NVARCHAR(4000);
SET @SQL_PVT1 = 'SELECT OrderTime, ' + LEFT(@columns,LEN(@columns)-1) +'
FROM (SELECT ES.Location, CONVERT(varchar(10), ES.OrderTime, 120),ES.Charge
FROM dbo.log_sales ES
) AS D (Location,OrderTime,Charge)
PIVOT (SUM (D.Charge) FOR D.Location IN
(';
SET @SQL_PVT2 = ') )AS PVT
ORDER BY OrderTime DESC';
SET @SQL_FULL = @SQL_PVT1 + LEFT(@columns,LEN(@columns)-1) +
@SQL_PVT2;
EXEC sp_executesql @SQL_FULL, N'@columns NVARCHAR(64)',@columns = @columns
dbml designer.cs
ファイルで、ストアドプロシージャのコード部分:
[Function(Name="dbo.proc_StatsDay")]
public int proc_EasyDay([Parameter(DbType="NVarChar(64)")] string columns)
{
IExecuteResult result = this.ExecuteMethodCall(this,((MethodInfo)MethodInfo.GetCurrentMethod())), columns);
return ((int)(result.ReturnValue));
}
解決
本当に切迫した動的なニーズがある場合、 DataContext.ExecuteQuery
結果スペースをカバーする型を作成します(プロパティ名はクエリの列名と一致する必要があります):
public class DynamicResult
{
public DateTime OrderDate {get;set;}
public decimal? Location1 {get;set;}
public decimal? Location2 {get;set;}
//..
public decimal? Location100 {get;set;}
}
次に呼び出し
IEnumerable<DynamicResult> result =
myDataContext.ExecuteQuery<DynamicResult>(commandString, param1);
他のヒント
返されたデータセットの後にアクセスするためのlinqオブジェクトを作成できます。
しかし、それは本当に役に立つでしょう。 Linqは、動的な結果ではなく、タイプセーフな呼び出しに役立ちます。コンパイル時に何を探すべきかわからないでしょう。
selectステートメントを実行します
SELECT ES.Location, DateAdd(dd, DateDiff(dd, 0, ES.OrderTime), 0),ES.Charge
FROM dbo.log_sales ES
結果をこのようなタイプにキャプチャします
public class LogSale
{
public string Location {get;set;}
public DateTime OrderDate {get;set;}
public decimal Charge {get;set;}
}
そして&quot; pivot&quot; /それをメモリに整理します
List<LogSale> source = LoadData();
var pivot = source
.GroupBy(ls => ls.OrderDate)
.OrderBy(g => g.Key)
.Select(g => new {
Date = g.Key,
Details = g
.GroupBy(ls => ls.Location)
.Select(loc => new {
Location = loc.Key,
Amount = loc.Sum(ls => ls.Charge)
})
});
これは、データを匿名型ではなくXMLにプッシュする2番目のピボット式Linqです。
var pivot = source
.GroupBy(ls => ls.OrderDate)
.OrderBy(g => g.Key)
.Select(g => new XElement("Date",
new XAttribute("Value", g.key),
g.GroupBy(ls => ls.Location)
.Select(loc => new XElement("Detail",
new XAttribute("Location", loc.Key),
new XAttribute("Amount", loc.Sum(ls => ls.Charge))
))
));
所属していません StackOverflow