LINQ to SQL: DataType Mapping Between SQL And .NET
好奇LINQ To SQL如何將SQL Data Type對應成.NET Data Type,我做了一個小實驗: 建了一個有18種不同資料型別的Data Table,把它拉進dbml中,看看LINQ to SQL對應出來的資料型別為何?
以下是整理出來的結果:
SQL Data Type |
Linq to SQL .NET Data Type |
tinyint |
System.Nullable<byte> |
smallint |
System.Nullable<short> |
int |
System.Nullable<int> |
bigint |
System.Nullable<long> |
float |
System.Nullable<double> |
real |
System.Nullable<float> |
smallmoney |
System.Nullable<decimal> |
money |
System.Nullable<decimal> |
numeric(6, 2) |
System.Nullable<decimal> |
numeric(12, 2) |
System.Nullable<decimal> |
numeric(18, 2) |
System.Nullable<decimal> |
xml |
System.Xml.Linq.XElement |
image |
System.Data.Linq.Binary |
binary, varbinary |
System.Data.Linq.Binary |
bit |
System.Nullable<bool> |
datetime |
System.Nullable<system.datetime> |
timestamp |
System.Data.Linq.Binary |
uniqueidentifier |
System.Nullable<system.guid> |
varchar, char, nvarchar, nchar, text, ntext |
System.String |
char(1), nchar(1) |
System.Char |
之前見識過ODP.NET會依不同數字欄位長度切換Single、Double或Decimal。在LINQ to SQL中也有類似的彈性做法,tinyint, smallint, int, bigint分別變成byte, short, int及long,但是smallmoney, money, numeric則一律轉成decimal。我喜歡這個設計方式,如此將不至於產生上次遇到的ODP.NET數字誤差。
SQL xml Data Type會變成System.Xml.Linq.XElement, image, binary, varbinary會變成System.Data.Linq.Binary,而timestamp則對應成System.Data.Linq.Binary。
最後提醒一下,除了Linq.Binary, Linq.XElement及String外,若資料庫欄位允許NULL時,則LINQ to SQL會把它轉成Nullable<T>,讓我們可以用null來對應到資料庫的NULL,十分直覺化。
愈用愈覺得LINQ to SQL是個好東西呀!!