小编Tri*_*tan的帖子

如何在EF6查询中使用TVP?(不是存储过程)

我在具有复杂EF6查询的Azure上遇到SQL性能问题.环境配置为弹性池.在开发区域,eDTU限制经常通过CPU使用率来命中,我将其归因于查询计划生成.

该应用程序相当通用,因此EF查询非常复杂,但在查询的内容中,通常有一个子查询通常具有IN子句.

SELECT Id FROM Event E WHERE E.Name IN (@p__linq__1, @p__linq__2, @p__linq__3)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT Id FROM Event E WHERE E.Name IN (@p__linq__4, @p__linq__5)
Run Code Online (Sandbox Code Playgroud)

虽然查询的其余部分是相同的,但是会生成新的SQL查询计划,因为文本因参数的数量而不同.

以前,在另一个项目中,我通过在连接中使用TVP而不是where子句来增加计划重用.

SELECT Id FROM Event E INNER JOIN @p_tvp_strings T ON E.Name = T.[Value]
Run Code Online (Sandbox Code Playgroud)

我无法通过IQueryable方式解决如何在EF中执行此操作.

我已经尝试创建一个Datatable并解析它作为参数但context.Database.SqlQuery不返回IQueryable.它立即执行命令.

var nameArray = new string[]
{
  "Bob", "Fred", "Bill",
};

var nameTable = CreateDataTable(nameArray);

var parameter = new SqlParameter("tvp", nameTable);
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "StringSet";

var names = context.Database.SqlQuery<string>("SELECT [Value] FROM @tvp", parameter).AsQueryable();
var people = context.People.Where(p => …
Run Code Online (Sandbox Code Playgroud)

performance entity-framework table-valued-parameters sql-execution-plan azure-sql-database

7
推荐指数
0
解决办法
99
查看次数