【问题标题】:How to use a c# method in a sql stored procedure如何在sql存储过程中使用c#方法
【发布时间】:2011-09-08 22:15:40
【问题描述】:

我想这样使用 linq:

MyDBEntities context = new MyDBEntities();
context.MyTable.Where(i => MyMethod(i.column, valueToTest).ToList();

public bool MyMethod(Object a, Object b)

但显然使用这种方法是不可能的

所以我想我可以在存储过程中使用该方法,我可以用 linq 调用

你觉得有可能吗?

【问题讨论】:

  • 很抱歉,您的问题毫无意义,标题谈到了存储过程,您的示例代码使用(我假设)Linq2Sql,而您想要实现的目标很糟糕。 .. 我认为您正在寻找 CLR 存储过程。 msdn.microsoft.com/en-us/library/ms131094.aspx - 但是你想做什么而 SQL 不允许你做呢?
  • @Phill,看起来他想编写一个方法,将指定列与指定值进行比较,并根据结果返回一个布尔值。
  • @Nick - 这是一个非常模糊的问题,我不知道为什么要对它投赞成票,没有太多可做的事情,对假设太开放了。

标签: c# sql sql-server linq stored-procedures


【解决方案1】:

希望我理解正确。

假设 MyTable 是一个包含 NameAddress 列的数据库表 无论结果是否包含您传递的指定值,以下是您如何获取值。

public void SomeMethod()
    {
        MyTable table= new MyTable();

        bool b=  MyMethod(table.Name, "Fred");
       if(b)
         //Do something
       else
         //Do something else
    }

    public bool MyMethod(MyTable a, object value)
    {
        using(var context= new MyDBEntities())
        {
            return context.MyTable.Where(i => a == value).Any();
        }
    }

这就是数据库表“MyTable”在幕后的样子。(数据上下文生成了这个)

public class MyTable
{
    public string Name { get; set; }
    public string Address { get; set; }
}

所以你可以在第一个方法中看到我将table.Name 传递给MyMethod,这是唯一可能的,因为MyTable 有一个名为Name 的公共属性。另请注意,我们使用 Object 类型作为值,因为参数可以是 int、字符串、日期时间,谁知道呢。

注意:这是未经测试的代码,但如果我理解正确,应该会走上正轨。

【讨论】:

    【解决方案2】:

    通常可以创建 C# 函数并在 SQL Server(2005 和更新版本)中使用它,但这并不简单 - 您必须使用 SQL CLR,这意味着您的函数、特殊引用、特殊类型等需要单独的项目。最后,您必须将程序集部署到 SQL Server 才能使用 SQL 中的功能。通用文档还包括如何创建自定义函数:

    Creating SQL Server Objects in Managed Code

    在 SQL Server 上拥有函数后,您可以在存储过程中使用它,也可以在查询中使用它。我实际上不确定您是否可以将这些函数导入 Linq-to-sql 或 EF 模型并在 Linq-to-sql 或 Linq-to-entities 查询中使用它们。

    【讨论】:

      【解决方案3】:

      在这里查看完整示例:

      Calling custom methods in LINQ-to-SQL

      【讨论】:

      • 恐怕这只适用于非常小的函数子集,因为您无法映射任意函数 - SQL 不知道如何执行它。它仅适用于内部映射到 SQL 对应对象的函数,例如 Math.xxxString.xxx 等。
      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多