我有一个ASP.NET MVC Web应用程序,它通过Entity Framework 4.0与SQL Server 2008数据库交互。
在特定页面上,我调用存储过程以根据UI上的选择撤回一些结果。
现在,用户界面有大约20种不同的输入选择,包括文本框,下拉列表,复选框等。
每个输入都被“分组”成逻辑部分。
示例:
所以我需要像这样打电话给SPROC:
exec SearchPage_FindResults @SearchQuery = 'Foo', @IncludeA1 = 1, @IncludeA2 = 0, @DropDownSelection = 3, @IncludeB1 = 1, @IncludeB2 = 1, @IncludeB3 = 0
UI对于这个问题并不重要 - 只是想提供一些观点。
基本上,我正在撤回搜索查询的结果,根据用户可以过滤的一堆(可选)选项过滤这些结果。
现在,我的问题/疑问:
从用户的角度来看,此页面非常重要,并且需要执行得非常好。存储过程的逻辑已经很重,所以我想尽量减少性能影响 - 所以请记住这一点。
话虽如此 - 这里最好的方法是什么?
答案 0 :(得分:3)
通过快速谷歌搜索,看起来实体框架不支持它们,但您可以在ADO中使用表值参数。
您可以通过在服务器中定义表类型来管理它:
CREATE TYPE yourTypeName AS TABLE (
columnName <column type>
-- more columns if you wish, too
)
然后通过创建一个SqlCommand来使用它,并执行以下操作:
SqlParameter param = command.CreateParameter();
param.ParameterName = "@something"
param.SqlDbType = SqlDbType.Structured
param.Value = // a DataTable which matches your table type, I can stick in code I use if you like
param.TypeName = "table type name";
您的程序将如下所示:
CREATE PROCEDURE procName
@something yourTypeName READONLY
AS
BEGIN
...
然后,您的SQL查询将使用该参数,就像它是一个表一样,尽管它是只读的。
性能方面,我不是DBA,我不确定XML的速度有多快 - 我收集它的速度非常快。虽然TVP速度非常快,但即使是我使用过的相对简单的DataTable方法运行也很棒。有关TVP here的更多信息,以及一些关于SQL和TVP的博客文章。