我正尝试使用LINQ连接到SQL存储过程。它适用于具有静态SQL查询的存储过程。LINQ to SQL调用使用动态SQL的存储过程
我想连接到具有动态SQL的存储过程。
在存储过程结束时,它有一个exec
语句。
exec(@srchQuery)
当我这样做时,它不起作用,因为它是动态SQL。
如果我使用print @srchQuery
并复制该存储过程,并在存储过程中使用该静态SQL,它可以正常工作。
我正尝试使用LINQ连接到SQL存储过程。它适用于具有静态SQL查询的存储过程。LINQ to SQL调用使用动态SQL的存储过程
我想连接到具有动态SQL的存储过程。
在存储过程结束时,它有一个exec
语句。
exec(@srchQuery)
当我这样做时,它不起作用,因为它是动态SQL。
如果我使用print @srchQuery
并复制该存储过程,并在存储过程中使用该静态SQL,它可以正常工作。
LINQ to SQL分析直接SELECT
语句,以查看执行所述SQL存储过程后必须投影的模型类型。由于您使用的动态语句使用EXEC
,因此无法确定要生成的模型类型。
简单的答案是要么不使用存储过程,而要使用LINQ to SQL来生成SQL,或者不要在存储过程中使用动态构建语句。
您正在生成SQL语句的事实意味着您有一个强大的用例,因为它可以在没有存储过程的情况下实现您想要的功能。总是喜欢简单...问自己,你是否需要使用动态构建语句在之内的存储过程?
只需直接调用存储过程的DataContext的范围内:
using (YourDataContext dc = new YourDataContext())
{
...
dc.ExecuteCommand("EXEC MyStoredProcedure");
...
}
这仍然会映射为linq结果集吗? – slamsal
简单是一件好事,但我需要一个存储过程中使用动态生成的语句。我可以在T-SQL中使用表变量。但是,我在这个领域不太熟悉。有没有人使用表变量,使其工作或知道可能工作的逻辑? – slamsal
@Bfree回答工作。没有真正简单的方法来做到这一点。我过去也遇到过同样的问题。我认为问题在于Linq to Sql无法“计算出”在执行时建立SELECT语句后将返回哪种类型。我做了什么来解决这个问题,是在存储过程中,我只做了一个选择并选择了我可能需要的所有列。然后,我让Linq给Sql生成基于此的函数。然后,我又回到了SQL,并将存储的proc改回了原来的样子。这里的技巧不是重新生成DBML。 – slamsal