【问题标题】:Use T-SQL custom function in C# code在 C# 代码中使用 T-SQL 自定义函数
【发布时间】:2013-04-17 17:09:17
【问题描述】:

我必须在我的数据库中定义一个自定义函数来计算实体的“有效期结束日期”。 此函数将在存储过程中使用,但我需要在 Web 应用程序中使用相同的逻辑。

我正在使用 Linq-to-sql 连接到我的数据库并将表映射到类。所以我想知道是否有办法重用我的数据库中定义的函数。我想通过部分类扩展我的实体。我必须重写代码中的逻辑吗?

注意我需要在我的 C# 代码中使用函数而不是存储过程。

【问题讨论】:

  • 我建议您不要使用 LINQ to SQL。微软无论如何都停止了它。使用Entity Framework,可以方便地映射存储过程。也就是说,here's an article by Scott Guthrie 描述了如何使用 Linq to SQL 映射和调用存储过程。
  • 你看我评论的最后一句话了吗?

标签: c# .net sql-server tsql linq-to-sql


【解决方案1】:

我发现可以通过 Linq-to-Sql 调用 SQL Server DB 中定义的函数。

我刚刚在dbml 上下文文件中导入了函数对象。所以我可以这样调用它:

context.fn_my_db_function(param1, param2, etc);

简单!

【讨论】:

    【解决方案2】:

    我必须重写代码中的逻辑吗?

    如果您希望数据库执行它(伪),则不是:

    public static YourReturnType Calculate(this TEntity foo)
    {
        return database.ExecuteFunction("calculate", foo);
    }
    

    如果您不希望每次计算都进行数据库往返,那么可以,您必须在 C# 中重写逻辑。

    【讨论】:

    • 这甚至可以自动生成,无需创建包装器,除非 A) 无法自动确定返回类型和/或 B) 需要添加一些逻辑。
    【解决方案3】:

    您可以创建一个存储过程,然后在您的 DBML 设计器中将其拖到“方法”窗格中,这将尝试自动检测返回类型和输入,并通过上下文实例公开。如果需要,您可以使用 Visual Studio 中的 Properties 视图将返回类型映射到表模型或自定义模型或其他东西。

    这就像 C# 中的函数一样被调用,例如:

    using (var context = new MyDataContext()) {
      var result = context.MyStoredProcedure(input);
    }
    

    result 是映射的托管类型,input 是必需的参数参数。

    【讨论】:

      【解决方案4】:

      这可以通过实体框架实现。请参阅此link 以供参考。

      您可以只映射您的存储过程并创建访问 get 方法。

      但是如果你只是想在你的数据库中执行你创建的过程。 .看到这个link。

      【讨论】:

        猜你喜欢
        • 2011-08-05
        • 1970-01-01
        • 2013-12-31
        • 2018-10-15
        • 2017-07-04
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多