linq中文教程(二十)

普通存储过程

  首先在查询分析器运行下面的代码来创建一个存储过程:

  


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_singleresultset()
  {
  IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
  return ((ISingleResult)(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) []

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值