LINQ to SQL 預設將儲存程序對應為 ISingleResult,僅支援單一結果集。若需多結果集,需手動修改生成代碼為 IMultipleResults。
[Function(Name="dbo.MeterTaskStat")]
public ISingleResult<XXXX> MeterTaskStat(...) { ... }
[Function(Name="dbo.MeterTaskStat")]
[ResultType(typeof(TaskStatData))] // 必須指定實體型別
public IMultipleResults MeterTaskStat(...) { ... }
關鍵點:加上 [ResultType] 屬性,回傳型別改為 IMultipleResults,ExecuteMethodCall 回傳值轉型為 IMultipleResults。
ALTER PROCEDURE [dbo].[MeterTaskStat] @MeterTaskType INT, @StartDate DateTime, @EndDate DateTime
AS BEGIN
SET NOCOUNT ON;
SELECT MeterCaliberName, SUM(Requisition) AS RequisitionCount, ... FROM (...) tempTable GROUP BY MeterCaliberName
-- 此處只有一個結果集,若有多個 SELECT 即為多結果集
END
// 業務層
public IEnumerable GetStatInfo(TaskType type, DateTime startDate, DateTime endDate) {
IMultipleResults info = Context.MeterTaskStat((int)type, startDate, endDate);
return info.GetResult<TaskStatData>();
}
// UI 層
protected void StatButton_Click(...) {
var info = _control.GetStatInfo(type, startDate, endDate);
RemoveGridView.DataSource = info.ToList();
RemoveGridView.DataBind();
}
多結果集時,依序呼叫 GetResult<T>() 取得各結果集,須與 SP 中 SELECT 順序一致。