教你如何實現(xiàn)linq存儲過程返回多條結(jié)果集
linq存儲過程曾經(jīng)一度困擾我。我下定決心要研究個明白,在我的仔細(xì)分析下,終于明白一些了,現(xiàn)在把得到的成果和大家分享一下。
linq存儲過程默認(rèn)生成的代碼是ISingleResult的,也就是只能返回一條結(jié)果集,我們先動手腳,將其改成IMultipleResults 的.實體類根據(jù)不同情況更改.
linq存儲過程更改前:
- [Function(Name="dbo.MeterTaskStat")]
- public ISingleResult<XXXX> MeterTaskStat
- ([Parameter(Name="MeterTaskType", DbType="Int")]
- System.Nullable<int> meterTaskType,
- [Parameter(Name="StartDate", DbType="DateTime")]
- System.Nullable<System.DateTime> startDate,
- [Parameter(Name="EndDate", DbType="DateTime")]
- System.Nullable<System.DateTime> endDate)
- {
- IExecuteResult result =
- this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),
- meterTaskType, startDate, endDate);
- return ((ISingleResult<XXXXXX>)(result.ReturnValue));
- }
linq存儲過程更改后:
- [Function(Name="dbo.MeterTaskStat")]
- [ResultType(typeof(TaskStatData))]
- public IMultipleResults MeterTaskStat
- ([Parameter(Name = "MeterTaskType", DbType = "Int")]
- System.Nullable<int> meterTaskType,
- [Parameter(Name = "StartDate", DbType = "DateTime")]
- System.Nullable
startDate, - [Parameter(Name = "EndDate", DbType = "DateTime")]
- System.Nullable
endDate) - {
- IExecuteResult result =
- this.ExecuteMethodCall
- (this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),
- meterTaskType, startDate, endDate);
- return ((IMultipleResults)(result.ReturnValue));
- }
注意到 多一條: [ResultType(typeof(TaskStatData))] 的記錄吧,簡單介紹一下,必須得為linq存儲過程的結(jié)果返回一個實體類型,而TaskStatData就是自己定義的類,[ResultType(typeof(TaskStatData))]必須加上,加linq存儲過程回值.
linq存儲過程:
- set ANSI_NULLS ON
- set QUOTED_IDENTIFIER ON
- go
- -- ===================================================
- -- Author:MaHong
- -- Create date: 2008-09-11
- -- Description: 根據(jù)口徑統(tǒng)計某段時間內(nèi)水表復(fù)裝任務(wù)信息
- -- ===================================================
- ALTER PROCEDURE [dbo].[MeterTaskStat]
- @MeterTaskType INT,
- @StartDate DateTime,
- @EndDate DateTime
- AS
- BEGIN
- SET NOCOUNT ON;
- SELECT MeterCaliberName,SUM(Requisition) AS
- RequisitionCount,SUM(Approve) AS ApproveCount,
- SUM(Disapprove) AS DisapproveCount,SUM(WaitWork) AS WaitWorkCount,
- SUM(CompleteY) AS CompleteYCount,SUM(CompleteN) AS CompleteNCount,
- SUM(Requisition+Approve+Disapprove+WaitWork+CompleteY+CompleteN) AS
- Subtotal
- FROM (SELECT MeterCaliberName
- ,CASE WHEN MeterTaskStatus=0 THEN 1 ELSE 0 END Requisition
- ,CASE WHEN MeterTaskStatus=1 THEN 1 ELSE 0 END Approve
- ,CASE WHEN MeterTaskStatus=11 THEN 1 ELSE 0 END Disapprove
- ,CASE WHEN MeterTaskStatus=2 THEN 1 ELSE 0 END WaitWork
- ,CASE WHEN MeterTaskStatus=4 THEN 1 ELSE 0 END CompleteY
- ,CASE WHEN MeterTaskStatus=5 THEN 1 ELSE 0 END CompleteN
- FROM View_MeterTaskMaintain WHERE [MeterTaskType] =
- @MeterTaskType AND StartDate BETWEEN @StartDate AND @EndDate) tempTable
- GROUP BY MeterCaliberName
- END
linq存儲過程之在business中間層直接調(diào)用:
- public class StatTaskControl : ControlBase
- {
- public IEnumerable
GetStatInfo - (TaskType type, DateTime startDate, DateTime endDate)
- {
- IMultipleResults info =
- Context.MeterTaskStat((int)type, startDate, endDate);
- IEnumerable
data = info.GetResult (); - return data;
- }
- }
linq存儲過程之ui層獲取:
- protected void StatButton_Click(object sender, EventArgs e)
- {
- DateTime startDate = DateTime.Parse(StartDate.Text);
- DateTime endDate = DateTime.Parse(EndDate.Text);
- TaskType type = TaskType.Remove;
- IEnumerable
info = - _control.GetStatInfo(type, startDate, endDate);
- List
data = info.ToList(); - RemoveGridView.DataSource = data;
- RemoveGridView.DataBind();
- }
整個linq存儲過程大概就是這么幾步.也不是太困難!
【編輯推薦】