如何在Linq to SQL中跳过传递可选参数给存储过程

4

我正在使用带有存储过程的Linq to SQL。

即使存储过程中设置了参数的默认值,我也必须向存储过程传递参数,即使这些参数是可选的。是否有任何方法可以跳过传递默认参数。

谢谢

2个回答

4
如回答中提到的链接已失效,我在此为未来的读者提供一个想法(当然我没有阅读提及的文章,但以下方法可行,我发表评论前进行了测试)。
您需要重载您的 SP(即 .designer.cs 类中的代码),并切掉您的可选参数 (默认情况下,当您将存储过程拖放到 DBML 类文件中时,它只会自动生成默认函数)。
例如,对于这个 SP:
CREATE PROCEDURE sp_Test
    @optionalParam INT = 0
AS
    -- your logic gose here

.designer.cs 文件中,您将默认得到以下内容。
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.sp_Test")]
public ISingleResult<sp_TestResult> sp_Test([global::System.Data.Linq.Mapping.ParameterAttribute(Name="optionalParam", DbType="Int")] System.Nullable<int> optionalParam)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), optionalParam);
    return ((ISingleResult<sp_TestResult>)(result.ReturnValue));
}

所以你需要 重载 这个函数,以下是代码:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.sp_Test")]
public ISingleResult<sp_sp_TestResult> sp_Test()
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
    return ((ISingleResult<sp_sp_TestResult>)(result.ReturnValue));
}

注意

  • DBML 设计文件将在每次添加/删除任何存储过程或表时重新生成,因此请确保在保存之前保留您的方法,或者将所有重载方法移动到新的局部类中。
  • 如果您有带有许多可选参数的存储过程,则必须为所有可能的组合生成重载方法,这可能会很快变得烦人。同时,在这种情况下,您必须使用命名参数调用存储过程。

链接已经恢复了,顺便说一下。 - GSerg
对你来说也许没问题,但对我来说返回 404! - Mehdi Dehghani
肯定可以工作,请仔细检查URL是否被裁剪,并且您没有安装可能会阻止它的插件。如果仍然无法工作,那可能是您的提供商阻止了它。 - GSerg
2
这非常简洁和优秀!特别要记住的是DBML重建。一定要把这些重载方法放在分部类中,就像他在“记住”部分提到的那样。 - Boyd P

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接