教你如何实现linq存储过程返回多条结果集

开发 后端
linq存储过程默认生成的代码是ISingleResult的,也就是只能返回一条结果集,我们先动手脚,将其改成IMultipleResults 的.实体类根据不同情况更改.

linq存储过程曾经一度困扰我。我下定决心要研究个明白,在我的仔细分析下,终于明白一些了,现在把得到的成果和大家分享一下。

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));  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

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));  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

注意到 多一条: [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  
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

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;  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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();  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

整个linq存储过程大概就是这么几步.也不是太困难!

【编辑推荐】

  1. 详谈Linq查询结果分析的方法
  2. 简简单单学习Linq查询语法
  3. 详细阐述Linq插入数据的操作方法
  4. 浅析Linq插入数据的实现方法
  5. 简单解决Linq多条件组合问题
责任编辑:阡陌 来源: 博客园
相关推荐

2009-09-09 10:54:52

Linq存储过程返回

2010-01-08 13:23:38

ibmdwInfoSphere

2011-08-29 15:52:19

SQL ServerMybatis存储过程

2009-09-15 15:45:00

Linq联合查询

2011-08-18 17:32:40

Oracle存储过程利用游标返回结果集

2009-09-09 10:58:58

Linq结果集形状

2009-09-09 11:14:04

Linq多个结果集

2010-05-07 13:03:01

Oracle通过存储过

2009-09-17 09:45:36

LINQ查询语句

2009-09-17 11:32:52

LINQ调用存储过程

2009-09-17 10:40:23

linq存储过程

2009-09-17 10:04:32

LINQ存储过程

2011-08-25 09:31:43

JDBC调用Oracl

2011-08-23 10:14:09

JDBC更新计数行调用存储过程SQL Server

2009-09-15 11:08:01

LinQ调用存储过程

2009-09-15 11:34:47

Linq多条件查询

2011-08-25 09:17:31

Java调用存储过程返回一行或多行结果集

2009-09-17 15:22:38

LINQ to SQL

2009-09-17 15:51:39

Linq to sql

2009-09-13 19:24:33

LINQ存储过程
点赞
收藏

51CTO技术栈公众号