Linq 中的IMultipleResult的用於調用預存程序擷取多個結果集(表)

來源:互聯網
上載者:User

 linq預存程序預設產生的程式碼是ISingleResult的,也就是只能返回一條結果集,我們先動手腳,將其改成IMultipleResults 的.實體類根據不同情況更改.

 

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預存程序的結果返回一個實體類型,而TaskStatData就是自己定義的類, [ResultType(typeof(TaskStatData))]必須加上,加linq預存程序回值.

  linq預存程序:

set ANSI_NULLS ON  
set QUOTED_IDENTIFIER ON  
go  
-- ===================================================  
-- Author:MaHong  
-- Create date: 2008-09-11  
-- Description: 根據口徑統計某段時間內水表複裝任務資訊  
-- ===================================================  
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中介層直接調用:

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預存程序大概就是這麼幾步.也不是太困難!

 

* 當把預存程序作為資料庫物件添加到.dbml檔案中式,為該預存程序映射到DataContext的子類中函數的時候,預設的是返回ISingleResult類型,而且會產生一個相應的實體類,這個實體類用於設定ISingleResult類型中元素的類型:private ISingleResult<實體類型> Pr_GetUsers(){ }, ISingleResult<實體類型> result = dbContext.Pr_GetUsers();;當預存程序返回的是多個結果集時(返回單個結果集時也可以設定),同時也需要多個結果集時,就應該手動更改預存程序的映射函數的傳回型別為IMultileResults,而且需要通過ResultType Attribute,設定返回若干結果集中每個結果集的類型。IMultipleResult result = dbContext.Pr_GetUsersAndRoles(); IEnumerable users = result.GetResult<User>(); IEnumerable roles = result.GetResult<Role>();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.