【发布时间】:2020-07-31 09:09:25
【问题描述】:
我正在使用 EF 6.4.4 来查询 SQL 视图。现在视图并不是真正表现最佳,但我无法控制它。
我在字符串/nvarchar 属性上使用 WHERE 语句执行以下代码
_context.ViewObject
.Where(x => x.Name == nameFilter)
.ToList();
同样,我在 SMSS 中执行了相同的 SQL 语句
SELECT [Id]
, [Name]
, ...
FROM [View]
WHERE [Name] = '<nameFilter>'
我的问题是 EF 变体比直接 SQL 查询慢得多。 在检查 EF 生成的 SQL 查询时,我看到以下内容:
SELECT [Id]
, [Name]
, ...
FROM [View]
WHERE [Name] = @p__linq__0
带有参数@p__linq__0 的类型为 NVARCHAR(4000) NULL
即使我的输入变量不是 NULL 并且最大长度为 6 个字符,这也是如此。 当我使用此参数执行相同的 sql 查询时,SMSS 也很慢。 显然,这是有问题的
所以我想做的是改变 EF 用来生成这个查询的 SQL 查询参数。这是为了确保我的参数在查询中更准确地表示,并且我可以获得与直接在 SMSS 中相同的性能。
有没有办法做到这一点?
【问题讨论】:
-
你似乎在追逐一条红鲱鱼。如果您也使用参数执行原始查询,并将该参数声明为
NVARCHAR(6) NOT NULL,该怎么办? -
向我们展示您“使用此参数执行相同的 sql 查询”的代码?
[Name]db 列是什么类型,无论是在表中还是在视图中? -
@CodeCaster 是的,尽管您会注意到最初的断言是在完成
select x from y where z = 'str'的地方性能很好,而且它不是 Unicode 'str'.. 所以我们真的应该看看首先是'str'与N'str'的性能(并确保我们正在针对“温暖”数据库执行)
标签: c# sql-server entity-framework