Linq 中的IMultipleResult的用于调用存储过程获取多个结果集(表)

原创 2011年01月21日 14:49:00

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

c# 通过存储过程返回表集合

DataSet ds = new DataSet(); SqlConnection conn = new SqlConnection(Properties.Settings....
  • pksniq
  • pksniq
  • 2011年10月26日 14:56
  • 1389

linq to entity 调用存储过程(带返还结果集的存储过程)

linq to entity 调用存储过程: 步骤一:像添加表一样添加存储过程 如下图:     然后在Model Browser窗口中右击已经增加的存储过程——》Add Functi...
  • zzginfo
  • zzginfo
  • 2012年04月19日 10:54
  • 5985

C# 读取在存储过程多结果集

C# 读取在存储过程多结果集
  • roy_88
  • roy_88
  • 2015年11月08日 16:47
  • 2467

jdbc调用存储过程,遍历两个结果集(获取存储过程返回的多个结果集),珍藏版

create table TopUsers ( id int identity(1,1) primary key,---编号 SellerNick varchar(600), SellerId int...
  • ruiguang21
  • ruiguang21
  • 2017年09月08日 11:28
  • 237

php调用mysql存储过程返回多个结果集的处理

 返回一个结果全世界都知道怎么处理,关键是返回多个结果集就不好办了,下面有一解决办法   存储过程代码DELIMITER $$;DROP PROCEDURE IF EXISTS `test`.`sp_...
  • jxncwzb
  • jxncwzb
  • 2009年11月13日 16:34
  • 6859

Java 执行存储过程--返回多个结果集

在JAVA中执行存储过程用 CallableStatement callsm= con.prepareCall(strsql); callsm.execute();  在执行存储过程后,要得到结果集c...
  • Baykermr
  • Baykermr
  • 2009年10月13日 16:01
  • 5056

mybatis调用存储过程返回多个结果集

我使用的是mysql数据库,映射2个实体对象:Account ,BankWatermybaits调用的时候需要使用resultMap属性由于mysql数据库支持存储过程使用select返回结果集,所以...
  • sinat_25295611
  • sinat_25295611
  • 2017年07月14日 11:39
  • 1084

EF获取存储过程多返回结果

在使用EF来获取存储过程结果时,当存储过程返回一个结果,那么我们可以使用生成的返回结果类即可,当返回多结果时,自动生成的就不够使用了,这时我们需要对生成的EF中xml文件进行配置。 环境要求:EF版...
  • u010512579
  • u010512579
  • 2016年08月29日 17:37
  • 749

JDBC调用存储过程 返回多结果集

package com.demo1; import java.sql.CallableStatement; import java.sql.Connection; import java...
  • kongfanyu
  • kongfanyu
  • 2016年10月28日 11:12
  • 1262

Mybatis调用存储过程返回多个结果集

数据库用的是SqlServer2008 图片为数据库执行存储过程返回的数据 Mybatis调用存储过程返回结果集 配置文件 ...
  • PAPALIAN
  • PAPALIAN
  • 2015年01月21日 19:40
  • 12950
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linq 中的IMultipleResult的用于调用存储过程获取多个结果集(表)
举报原因:
原因补充:

(最多只允许输入30个字)