【问题标题】:Passing a stored procedure call from a LINQ data context to another method. C#将存储过程调用从 LINQ 数据上下文传递到另一个方法。 C#
【发布时间】:2009-02-26 17:20:17
【问题描述】:

我觉得这个问题的答案可能在于代表,但我很难理解代表的概念。主要问题是我读过的每一个代表的解释和例子总是围绕着做一些你可以在没有代表的情况下完成的事情的方法,所以对我来说它没有教给我任何东西。通过查看真实世界的示例,我学得最好。

现在已经不碍事了,这就是我想要完成的事情。我有一个包含许多存储过程的数据上下文 (.dbml)。我也有多种情况,我使用完全相同的 20 行代码来更新表中的一列,但除了使用不同的数据网格之外,唯一的区别是调用了存储过程。为了减少使用的代码量,我希望有一种方法可以将数据上下文对象中的存储过程调用作为参数传递。这样我就可以将所有代码移动到一个可重用的函数中。这甚至可能吗?我正在使用 Visual Studio 2008 和 C#。

感谢您的指导。

【问题讨论】:

    标签: c# .net linq-to-sql datacontext


    【解决方案1】:

    虽然我无法在 sql/stored proc 方面为您提供帮助,但我可以尝试解释委托,至少从 C# 的角度来看。

    虽然通常您将函数声明为类的一部分(因此它们与类紧密相连),但有时您希望将它们放入变量中。一旦你这样做了,你就可以传递它,就像你传递任何其他变量一样。

    所以我们知道字符串是一种可以将文本粘贴到其中的变量。之后,委托是您将函数插入的变量。然而,这非常令人困惑,因为 C# 与它在代码中命名事物的方式不一致或不清楚。观察:

    public void WriteText() {
      Console.WriteLine("Hello");
    }
    
    ...
    Action x = WriteText;
    x(); // will invoke the WriteText function
    

    请注意,我们使用“Action”,其中逻辑暗示代码应为delegate x = WriteText。我们需要这个额外的混乱的原因是因为“代表”本身就像System.Object。它不包含任何信息,它是一切背后的“基类”。如果我们真的想使用一个,我们必须附加一些类型信息。这就是Action的用武之地。Action的定义如下:

    public delegate void Action();
    

    这段代码的意思是“我们正在声明一个名为 Action 的新委托,它不接受任何参数并返回 void”。此后,如果您有任何不带参数并返回 void 的函数,请将它们放入 Action 类型的变量中。

    现在,您可以将普通函数粘贴到委托中,但您也可以将“匿名”函数粘贴到委托中。 “匿名”函数是您在内联声明的东西,因此我们可以像这样在代码中间构建一个新函数,而不是附加已经声明的 WriteText 函数:

    Action x = () => { Console.WriteLine("Hello"); };
    x(); // invoke our anonymous function.
    

    这样做是使用 C#“lambda 语法”来声明一个新的匿名函数。作为函数的一部分运行的代码(当我们调用它时)是Console.WriteLine

    所以

    总而言之,你可以有一个“SaveData”函数,并传递一个委托。它可以完成 20 行表构建,然后将该表传递给委托,委托可以调用适当的存储过程。这是一个简单的例子:

    public void SaveData(Action<Table> saveFunc){
        var t = new Table();
        ... 20 lines of code which put stuff into t ...
        saveFunc(t);
    }
    
    SaveData( t => StoredProc1.Invoke(t) ); // save using StoredProc1
    SaveData( t => StoredProc37.Invoke(t) ); // save using StoredProc37
    

    所以

    说了这么多。这不是我实际解决问题的方式。与其将委托传递给您的 savedata 函数,不如让您的 SaveData 函数简单地返回表,然后您可以调用适当的 StoredProc 而无需委托

    【讨论】:

    • 非常感谢。这有很大帮助。我现在明白了
    • 很高兴我的大量文章很有用:-)
    猜你喜欢
    • 2019-10-13
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多