【问题标题】:LINQ to SQL calling stored procedure that uses dynamic SQLLINQ to SQL 调用使用动态 SQL 的存储过程
【发布时间】:2017-09-14 12:03:26
【问题描述】:

我正在尝试使用 LINQ 连接到 SQL 存储过程。它适用于具有静态 SQL 查询的存储过程。

我想连接到具有动态 SQL 的存储过程。

在存储过程的末尾有一个exec 语句。

exec(@srchQuery) 

当我这样做时它不起作用,因为它是动态 SQL。

如果我使用 print @srchQuery 并复制该存储过程并在存储过程中使用该静态 SQL,则它可以正常工作。

【问题讨论】:

    标签: linq-to-sql stored-procedures


    【解决方案1】:

    LINQ to SQL 分析直接的SELECT 语句,以查看作为执行所述 SQL 存储过程的结果它必须投影的模型类型。因为您使用的是使用EXEC 的动态语句,所以它无法确定要生成的模型类型。

    简单的答案是要么不使用存储过程,而是使用 LINQ to SQL 生成 SQL,或者不要在存储过程中使用动态构建语句。

    您正在生成一条 SQL 语句这一事实一定意味着您有一个强大的用例,因为它可以在没有存储过程的情况下实现您想要的。总是喜欢简单...问问自己,您是否需要在存储过程中使用动态构建的语句

    【讨论】:

    • 简单是件好事,但我需要在存储过程中使用动态构建的语句。我可能可以在 T-SQL 中使用表变量。但是,我对那个领域不太熟悉。有没有人使用表变量并使其工作或知道可能工作的逻辑?
    • @Bfree 答案有效。没有真正简单的方法可以做到这一点。我过去也遇到过同样的问题。我认为问题在于 Linq to Sql 无法“确定”将返回哪种类型,因为您在执行时构建了 SELECT 语句。我为解决这个问题所做的工作是在存储过程中,我只做了一个选择并选择了我可能需要的所有列。然后,我让 Linq to Sql 以此为基础生成函数。然后,我回到 SQL 并将存储过程更改回它应该的方式。这里的诀窍是不要重新生成您的 DBML。
    【解决方案2】:

    直接在DataContext中调用存储过程:

    using (YourDataContext dc = new YourDataContext())
    {
        ...
        dc.ExecuteCommand("EXEC MyStoredProcedure");
        ...
    }
    

    【讨论】:

    • 这仍然会映射为 linq 结果集吗?
    • 不,不会有结果集。存储过程执行将导致输出一个整数值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多