查詢 ReportsToEmployee == null(不屬於任何主管的員工)有三種寫法:
// 1. 直接比較 null
var q1 = from e in db.Employees where e.ReportsToEmployee == null select e;
// 2. 使用 Nullable<T>.HasValue
var q2 = from e in db.Employees where !e.ReportsTo.HasValue select e;
// 3. 取得非 Null 時的值
var q3 = from e in db.Employees
where e.ReportsTo.HasValue
select new { e.FirstName, e.LastName, ReportsTo = e.ReportsTo.Value };
三者生成 SQL 邏輯相同,皆為 WHERE ReportsTo IS NULL 或 IS NOT NULL。
LINQ to SQL 支援 Year、Month、Day、Hour、Minute、Second、Millisecond、DayOfWeek、DayOfYear 等屬性轉譯。
| 型別 | 最小值 | 最大值 | 精度 |
|---|---|---|---|
| System.DateTime | 0001-01-01 | 9999-12-31 | 100 奈秒 |
| T-SQL DateTime | 1753-01-01 | 9999-12-31 | 3.33 毫秒 |
| T-SQL SmallDateTime | 1900-01-01 | 2079-06-06 | 1 分鐘 |
.NET DateTime 範圍較大、精度較高;從 SQL 讀取不會遺失精度,但寫入時可能遭截斷。時區資訊 SQL Server 不支援,需自行轉換。
// 1997 年的訂單
var q1 = from o in db.Orders where o.OrderDate.Value.Year == 1997 select o;
// 12 月的訂單
var q2 = from o in db.Orders where o.OrderDate.Value.Month == 12 select o;
// 每月 31 號的訂單
var q3 = from o in db.Orders where o.OrderDate.Value.Day == 31 select o;
注意:OrderDate 為 Nullable<DateTime>,需存取 .Value 才能使用日期屬性。