• Linq to sql(五):存储过程(一)


    普通存储过程

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

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

  • 相关阅读:
    xgboost系列之应用xgboost的注意事项
    【pandas】pandas.DataFrame.rename()---重置索引名称
    【剑指offer】复杂链表的复制
    【剑指offer】二叉树中和为某一值的路径,C++实现
    设计模式21 访问者模式
    设计模式20 迭代器模式
    设计模式19 中介者模式
    设计模式18 观察者模式
    设计模式17 状态模式
    设计模式16 责任链模式
  • 原文地址:https://www.cnblogs.com/kevin2013/p/1749085.html
Copyright © 2020-2023  润新知