首先在查询分析器运行下面的代码来创建一个存储过程:
create proc sp_singleresultset
as
set nocount on
select * from customers
然后打开 IDE 的服务器资源管理器,之前我们从表中拖动表到 dbml 设计视图,这次我
们从存储过程中找到刚才创建的存储过程,然后拖动到设计视图。在方法面板中可以看到已
经创建了一个 sp_singleresultset 的方法。
然后打开 Northwind.designer.cs,可以找到下面的代码:
[Function(Name="dbo.sp_singleresultset")]
public ISingleResult<sp_singleresultsetResult> sp_singleresultset()
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((ISingleResult<sp_singleresultsetResult>)(result.ReturnValue));
}
我们可以发现,IDE 为这个存储过程单独生成了返回结果集的实体定义,你可能会觉得很奇
怪,IDE 怎么知道这个存储过程将会返回哪些数据那?其实,在把存储过程拖拽入 dbml 设
计视图的时候,IDE 就执行了类似下面的命令:
SET FMTONLY ON;
exec Northwind.dbo.sp_singleresultset
SET FMTONLY OFF;
这样就可以直接获取存储过程返回的元数据而无须执行存储过程。
其实我们存储过程返回的就是顾客表的数据,如果你觉得为存储过程单独设置结果集实
体有些浪费的话可以在存储过程的属性窗口中调整返回类型从“自动生成的类型”到
Customer,不过以后你只能通过删除方法面板中的存储过程,然后重新添加来还原到“自动
生成的类型”。下面,我们可以写如下的 Linq to object 代码进行查询:
var 单结果集存储过程 =
from c in ctx.sp_singleresultset()
where c.CustomerID.StartsWith("A")
select c;
在这里确实是 Linq to object 的,因为查询句法不会被整句翻译成 SQL,而是从存储过
程的返回对象中再去对对象进行查询。SQL 代码如下:
EXEC @RETURN_VALUE = [dbo].[sp_singleresultset]
create proc sp_singleresultset
as
set nocount on
select * from customers
然后打开 IDE 的服务器资源管理器,之前我们从表中拖动表到 dbml 设计视图,这次我
们从存储过程中找到刚才创建的存储过程,然后拖动到设计视图。在方法面板中可以看到已
经创建了一个 sp_singleresultset 的方法。
然后打开 Northwind.designer.cs,可以找到下面的代码:
[Function(Name="dbo.sp_singleresultset")]
public ISingleResult<sp_singleresultsetResult> sp_singleresultset()
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((ISingleResult<sp_singleresultsetResult>)(result.ReturnValue));
}
我们可以发现,IDE 为这个存储过程单独生成了返回结果集的实体定义,你可能会觉得很奇
怪,IDE 怎么知道这个存储过程将会返回哪些数据那?其实,在把存储过程拖拽入 dbml 设
计视图的时候,IDE 就执行了类似下面的命令:
SET FMTONLY ON;
exec Northwind.dbo.sp_singleresultset
SET FMTONLY OFF;
这样就可以直接获取存储过程返回的元数据而无须执行存储过程。
其实我们存储过程返回的就是顾客表的数据,如果你觉得为存储过程单独设置结果集实
体有些浪费的话可以在存储过程的属性窗口中调整返回类型从“自动生成的类型”到
Customer,不过以后你只能通过删除方法面板中的存储过程,然后重新添加来还原到“自动
生成的类型”。下面,我们可以写如下的 Linq to object 代码进行查询:
var 单结果集存储过程 =
from c in ctx.sp_singleresultset()
where c.CustomerID.StartsWith("A")
select c;
在这里确实是 Linq to object 的,因为查询句法不会被整句翻译成 SQL,而是从存储过
程的返回对象中再去对对象进行查询。SQL 代码如下:
EXEC @RETURN_VALUE = [dbo].[sp_singleresultset]
-- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0) [