LINQ-to-SQL:存储过程返回单个标量值?
我正在使用LINQ-to-SQL来查询旧数据库的应用程序。 我需要调用一个存储过程,它选择一个整数值。 无法更改存储过程。
设计者使用此签名创建一个方法:
private ISingleResult NextRowNumber([Parameter(DbType="Int")] System.Nullable increment, [Parameter(DbType="Char(3)")] string dataset)
我希望返回类型为int。 如何使用LINQ-to-SQL执行此操作?
使用标量函数(UDF)而不是SP,这将是微不足道的。 但是,它应该足够容易 – 虽然如果SP很复杂(即FMT_ONLY无法100%检查它),那么你可能需要“帮助”它……
这是我从一个返回整数的simplfied 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类。
将@VALUE作为proc的最后一个语句返回。
然后它将自动检测int,string,bool等类型,并相应地生成包装器方法。
如果您在Linq to SQL类项目中使用Visual Studio的.xsd文件,请确保:
- 右键单击适配器中的存储过程或函数调用。
- 选择属性
- 将执行模式更改为标量
这将使您的适配器函数返回类型为“对象”。 然后,您需要将其强制转换为int或string,或者它应该是什么类型。
上述就是C#学习教程:LINQ-to-SQL:存储过程返回单个标量值?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031074.html