此處討論的是MS-SQL
以及C# EF
部分
當我有一張表T1
如下
欄位 | 型別 |
---|---|
A | int |
B | nvarchar(10) |
hash | varchar(64) |
那他C#通常對應的Entity class如下
public class T1
{
public int A { get; set; }
public string B { get; set; }
public string Hash { get; set; }
}
此時我們使用EF的基本查詢
string str = '12345';
var Query = Context.T1.Where(t=> t.hash == str).ToQueryString();
此時Query的值,也就是產出的語法如下
DECLARE @__str_0 nvarchar(4000) = '12345';
SELECT [t].[A], [t].[B], [t].[hash]
FROM [T1] AS [t]
WHERE [t].[hash] = @__str_0
發現問題了嗎?我們的hash是varchar,而EF預設將string轉為nvarchar,造成CONVERT_IMPLICIT,會有嚴重的效能問題。
解決辦法其實很容易,將class該欄位補上一條語法即可
[Column(TypeName = "varchar(64)")]
public string Hash { get; set; }