【问题标题】:Entity Framework using SQL_VARIANT使用 SQL_VARIANT 的实体框架
【发布时间】:2018-08-01 13:40:43
【问题描述】:

我有以下示例,我在 INT 字段上查询实体。以下是我的场景示例:

int test =1;
var listExample= _db.EntityTable.Where(x => x.StatusId == test).ToList();

当我查看生成的 SQL 时,它使用 SQL_VARIANT 作为变量声明,因此没有正确使用表上的索引,从而导致整个表扫描。

以下是生成的 SQL 示例:

DECLARE @p__linq__0 AS SQL_VARIANT;
SET @p__linq__0 = NULL;

SELECT 
[Extent1].[id] AS [id], 
FROM [dbo].[tbl_table_example] AS [Extent1]
WHERE [Extent1].[status_id] = @p__linq__0

有没有办法让 EF 尝试将变量定义为被查询的属性类型?

【问题讨论】:

  • 您是否使用了 ADO.NET EF 向导,或者您是否手动编写了类代码?通常情况下,如果您使用 EF 向导,它将确定类型,而不是在您的示例中进行装箱和拆箱。
  • 在课堂上处理。我有一个实体类和配置类与数据库表关联。
  • 请同时发布这些定义。
  • 类属性:public int?状态 ID { 获取;放; } 配置:Property(p => p.StatusId) .HasColumnName("status_id"); HasOptional(p => p.Status) .WithMany() .HasForeignKey(p => p.StatusId);

标签: c# sql entity-framework indexing


【解决方案1】:

我认为这只是 Visual Studio IntelliTrace 生成与实际执行的 SqlCommand 对应的 SQL 批处理方式的错误或限制。我复制了这个,但是查看了通过 SQL Profiler 发送的 SQL,它看起来是正确的:

exec sp_executesql N'SELECT [x].[Id], [x].[StatusId]
FROM [EntityTable] AS [x]
WHERE [x].[StatusId] = @__test_0',N'@__test_0 int',@__test_0=1

EF 日志也报告正确的参数类型:

SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[StatusId] AS [StatusId]
    FROM [dbo].[EntityTables] AS [Extent1]
    WHERE [Extent1].[StatusId] = @p__linq__0


-- p__linq__0: '1' (Type = Int32, IsNullable = false)

-- Executing at 8/1/2018 9:41:32 AM -05:00

-- Completed in 20 ms with result: SqlDataReader

而 IntlliTrace 输出(注意第一行的警告)是:

--Type and value data was not available for the following variables. Their values have been set to defaults.
DECLARE @p__linq__0 AS SQL_VARIANT;
SET @p__linq__0 = NULL;

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[StatusId] AS [StatusId]
    FROM [dbo].[EntityTables] AS [Extent1]
    WHERE [Extent1].[StatusId] = @p__linq__0

【讨论】:

  • 你认为这是因为拳击吗?我觉得变量像盒装一样进入 SQL 服务器,然后可能会发生转换。否则,如果作为整数传递,我会假设将使用索引。
  • 应该使用索引。值是否被装箱是无关紧要的。从 Profiler 跟踪中可以看出,参数作为 int 发送,并且可以使用索引,除非实际列类型为 smallinttinyint
  • 嗨大卫,我复制了你所做的,你似乎是正确的,问题出在 Visual Studio 上。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多