2012-08-28 55 views
4

我有下面的代碼首先實體:實體框架中包含查詢在VARCHAR列

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

我不認爲你可以改變傳遞到一些配置的查詢參數的類型,但是你可以下載EF的源代碼,並修改它自己只使用'VARCHAR'。 –

回答

0

這是,如果你的索引數據表是小到可以預期的。

數據的SQL的最低金額會從磁盤中讀取是8K(頁),所以如果它使用索引那麼它將需要再次兩次訪問磁盤,一旦該指數的數據。如果所有的數據適合一個8K數據頁,然後它可以在一個讀去,無論如何,所以使用該索引將增加uneccessary磁盤IO。