当前位置:  开发笔记 > 编程语言 > 正文

LINQ-to-SQL:返回单个标量值的存储过程?

如何解决《LINQ-to-SQL:返回单个标量值的存储过程?》经验,为你挑选了2个好方法。

我正在使用LINQ-to-SQL来查询旧数据库的应用程序.我需要调用一个存储过程,它选择一个整数值.无法更改存储过程.

设计者使用此签名创建方法:

private ISingleResult NextRowNumber([Parameter(DbType="Int")] System.Nullable increment, [Parameter(DbType="Char(3)")] string dataset)

我希望返回类型为int.如何使用LINQ-to-SQL执行此操作?



1> Marc Gravell..:

对于标量函数(UDF)而不是SP,这将是微不足道的.但是,它应该足够容易 - 虽然如果SP很复杂(即FMT_ONLY无法100%检查它),那么你可能需要"帮助"它......

这是我从一个返回整数的简化SP生成的一些dbml; 您可以通过"open with ... xml editor"编辑dbml:


    
    
    

(注意你显然需要调整名称和数据类型).

这是生成的C#:

[Function(Name="dbo.foo")]
public int foo([Parameter(DbType="Int")] System.Nullable inc, [Parameter(DbType="VarChar(20)")] string dataset)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
    return ((int)(result.ReturnValue));
}

如果您当前的SP使用SELECT(而不是RETURN),那么DBML将需要反映这一点.您可以通过隐藏实现细节并在分部类中提供公共包装来解决此问题; 例如:


    
    
    
      
    

以上描述了一个返回单个表的SP的SP; 但我已经使SP"私有"到数据上下文,结果类型"内部"到程序集(隐藏它):

[Function(Name="dbo.foo")]
private ISingleResult FooPrivate(
    [Parameter(DbType="Int")] System.Nullable inc,
    [Parameter(DbType="VarChar(20)")] string dataset)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
    return ((ISingleResult)(result.ReturnValue));
}

现在在我自己的类文件中,我可以在正确的命名空间中添加一个新的部分类(一个新的.cs文件),这样可以更方便地公开该方法:

namespace MyNamespace {
    partial class MyDataContext
    {
        public int Foo(int? inc, string dataSet)
        {
            return FooPrivate(inc, dataSet).Single().value;
        }
    }
}

(命名空间和上下文名称需要与实际数据上下文相同).这会添加一个公共方法,隐藏来自调用者的脏话细节.

不要直接编辑designer.cs文件; 你的改变将会丢失.仅编辑dbml或partial类.



2> 小智..:

将@VALUE作为proc的最后一个语句返回.

然后它将自动检测int,string,bool等类型,并相应地生成包装器方法.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有