实体框架包含varchar列的查询

时间:2012-08-28 14:19:37

标签: entity-framework code-first

我有以下Code First实体:

public class Department
{ 
    public int DepartmentID { get; set; }
    public string DepartmentName { get; set; }
}

我设置的配置如下表所示:

dbo.Departments
    DepartmentID INT PRIMARY KEY
    DepartmentName VARCHAR(75)

我手动为DepartmentName添加了索引并运行以下查询:

var depts = new string[] { "Engineering", "Manufacturing" };
var departments = from d in db.Departments
                  where depts.Contains(d.DepartmentName)
                  select d;

当我运行跟踪时,它产生了以下SQL:

SELECT 
[Extent1].[DepartmentID] AS [DepartmentID], 
[Extent1].[DepartmentName] AS [DepartmentName]
FROM [dbo].[Departments] AS [Extent1]
WHERE [Extent1].[DepartmentName] IN (N'Engineering',N'Manufacturing')

由于我的列是varchar并且查询正在将文本转换为NVARCHAR,因此优化器选择在我的DepartmentName索引上执行聚簇索引扫描而不是索引搜索。

除了更改我的数据库以使用nvarchar之外,有没有办法解决这个问题?这是一个错误还是正常的?

1 个答案:

答案 0 :(得分:0)

如果您的索引数据表很小,这是可以预期的。

SQL将从磁盘读取的最小数据量为8k(一页),因此如果它使用索引,则需要访问磁盘两次,一次针对索引,然后再针对数据。如果所有数据都适合一个8k数据页面,那么无论如何都可以一次性读取,因此使用索引会添加不必要的磁盘IO。