舊版 ToScalar() 回傳 object,需手動轉型。新版支援泛型:
int maxId = DbSession.Default.From()
.Select(Products._.ProductID)
.Top(1)
.ToScalar(); // 直接回傳 int,null/DBNull 自動轉為 default(T) = 0
// 全部回傳強型別 TResult,null → default(TResult)
decimal avgPrice = DbSession.Default.Avg(Products._.UnitPrice, WhereClip.All);
int totalQty = DbSession.Default.Sum(Products._.UnitsInStock, WhereClip.All);
decimal maxPrice = DbSession.Default.Max(Products._.UnitPrice, WhereClip.All);
decimal minPrice = DbSession.Default.Min(Products._.UnitPrice, WhereClip.All);
bool hasDiscontinued = DbSession.Default.Exists(Products._.Discontinued == true);
// 產生:SELECT CASE WHEN EXISTS(...) THEN 1 ELSE 0 END → 映射為 bool
比 Count > 0 更高效(資料庫可短路),語意更清晰。
Convert.ChangeType。NULL / DBNull.Value → default(TResult)(數值 0、bool false、reference null)。InvalidCastException(開發期即可發現)。var stats = new {
ProductCount = DbSession.Default.Count(WhereClip.All),
AvgPrice = DbSession.Default.Avg(Products._.UnitPrice, WhereClip.All),
MaxPrice = DbSession.Default.Max(Products._.UnitPrice, WhereClip.All),
HasDiscontinued = DbSession.Default.Exists(Products._.Discontinued == true)
};
// 直接序列化為 JSON 回傳前端,無需手動轉型
強型別純量查詢讓統計類程式碼更簡潔、型別安全、效能更優(避免 boxing/unboxing)。