【问题标题】:How does EF determine nullable parameters?EF 如何确定可为空的参数?
【发布时间】:2011-12-10 08:20:20
【问题描述】:

我有一个 SQL 存储过程,我需要能够将 NULL 作为值传递给它的参数之一,以便在这样的查询中使用:

create procedure sp
    @param1 varchar(30)
as
select * from table where field = isnull(@param1, field)

所以我需要知道如何告诉 EF 使 @param1 可以为空。我该怎么做?

谢谢!

如果有帮助,我使用 EF 的过程是:

  1. 创建 SP
  2. 更新模型 (edmx)
  3. 添加新功能导入
  4. 点击按钮生成新的复杂类型
  5. 在单独的模板文件上运行自定义工具(生成 POCO)

【问题讨论】:

  • 如何将 NULL 传递给 varchar(30),除非它是可选参数?
  • 它不会给出错误,它在运行时需要一个非空参数吗?
  • @Akash - 是的,因为生成的复杂类型将此参数作为字符串而不是“字符串?”,因此问题。
  • @subt13 -1,请阅读关于 C# 字符串的一些内容,String 默认可以为空,如果你能证明字符串?存在或什至可能,我将删除我的反对票。
  • @Akash - 是的,我意识到没有字符串?并且该字符串已经可以为空。顺便说一句,如果您对这个问题有答案,请随时发布,而不是向我发送垃圾邮件。

标签: c# tsql entity-framework-4 poco


【解决方案1】:

作为一种变通方法,您可以声明两个单独的存储过程:

-- use this for non-null parameters
create procedure sp
    @param1 varchar(30)
as
select * from table where field = @param1

-- use this for null
create procedure sp_null
as
select * from table

然后你就可以用 C# 编写所需的抽象了:

public ... GetSp(string param1)
{
    if (param1 == null)
        return ....sp_null();
    else
        return ....sp(param1);
}

【讨论】:

  • 我实际上可以只添加一个额外的位参数,并在同一个 sp 中有两个代码路径,可能比两个独立的更干净......
【解决方案2】:

快速浏览一下,我在 stackoverflow 上找到了这个。希望对您有所帮助。

Entity Framework 4.0 Entity SQL passing null ObjectParameter parameters

【讨论】:

    【解决方案3】:

    使用DBNull.Value,我已经用我的一个存储过程做到了这一点。要调用您的程序,我的代码如下所示:

    List<ObjectParameter> objectParameterList = new List<ObjectParameter>();
    if (string.IsNullOrEmpty(param1))
    {
        object nullValue = DBNull.Value;
        objectParameterList.Add(new ObjectParameter("param1", nullValue));
    }
    else
    {
        objectParameterList.Add(new ObjectParameter("param1", param1));
    }
    
    context.ExecuteFunction("MyEFModel.sp", objectParameterList.ToArray());
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      将存储过程中的默认值设置为NULL。

      create procedure sp
          @param1 varchar(30) =NULL
      as
      select * from table where field = isnull(@param1, field)
      

      【讨论】:

      • 不起作用。 -1 在猜测之前甚至没有尝试。
      • @subt13,有人想帮助你,你没有付钱给任何人来帮助你,所以请试着说谢谢你的帮助,没有人会停止他们的工作并尝试你的解决方案,因为这是你的工作!不是芝诺的。这是一个工作场所,Zeno 会因为告诉你解决方案而获得金钱。
      • @subt13.. 我曾经遇到过类似的问题,通过在存储过程本身中设置默认参数解决了它,这就是我分享它的原因。我的家用计算机中没有设置任何环境,因此没有机会对其进行测试。对于您在测试时浪费的时间,我深表歉意。 @Akash .. 感谢您的支持
      • @subt13,String 已经可以为空了,你还想要什么?我很愚蠢地忽略了字符串参数类型,但现在我意识到,你总是可以将 null 传递给字符串参数。
      • @ZeNo - 您可能会在下一次在您的解决方案中提到这一点,或者提供一些证明它有效的证据。在您发布您的“答案”之前,我已经尝试过了,但它不起作用。也许现在您可以明白为什么它似乎只是一个行不通的“猜测”,会导致浪费时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      相关资源
      最近更新 更多