過去若要 UPDATE table SET a = b + c,必須先查出實體、記憶體運算、再 Update。現在 Update<T>(Field target, FieldExpression expr, WhereClip where) 直接支援欄位運算式,SQL 端完成運算,效能更高、併發更安全。
+ 加法- 減法* 乘法/ 除法% 餘數運算元可為:欄位、常數、欄位與常數混合。
DbSession.Default.Update(
Products._.UnitPrice,
Products._.ReorderLevel + Products._.UnitPrice,
Products._.ProductID == 1);
產生 SQL:
UPDATE [Products] SET [UnitPrice] = [Products].[ReorderLevel] + [Products].[UnitPrice]
WHERE [Products].[ProductID] = @p0
Parameters: @p0 = 1
將 UnitPrice 更新為「原 UnitPrice + ReorderLevel」,單一 SQL 完成,無競爭條件。
DbSession.Default.Update(
Products._.UnitPrice,
Products._.UnitPrice + 1,
Products._.ProductID == 1);
產生 SQL:
UPDATE [Products] SET [UnitPrice] = [Products].[UnitPrice] + @p0
WHERE [Products].[ProductID] = @p1
Parameters: @p0 = 1, @p1 = 1
常數自動參數化,防注入。同理支援 UnitPrice - 5、UnitPrice * 1.1、Quantity / 2 等。
UnitsInStock = UnitsInStock - @qtyTotalAmount = TotalAmount + @orderAmtViewCount = ViewCount + 1Price = Price * 1.05所有運算在資料庫引擎執行,原子性保證,免去「查-改-存」三步驟與鎖競爭,是高併發系統的關鍵優化利器。