列表擴充套件
資料庫查詢中的常見場景是 IN (...)
,其中此處的列表是在執行時生成的。大多數 RDBMS 缺乏一個很好的比喻 - 並且沒有通用的跨 RDBMS 解決方案。相反,dapper 提供了一些溫和的自動命令擴充套件。所需要的只是提供的引數值,即 IEnumerable
。涉及 @foo
的命令擴充套件為 (@foo0,@foo1,@foo2,@foo3)
(對於 4 個專案的序列)。最常見的用法是 IN
:
int[] orderIds = ...
var orders = connection.Query<Order>(@"
select *
from Orders
where Id in @orderIds", new { orderIds });
然後,它會自動擴充套件以為多行提取發出適當的 SQL:
select *
from Orders
where Id in (@orderIds0, @orderIds1, @orderIds2, @orderIds3)
將引數 @orderIds0
等新增為從 arrray 獲取的值。請注意,它本身是無效的 SQL 最初是故意的,以確保不會錯誤地使用此功能。此功能也適用於 SQL Server 中的 OPTIMIZE FOR
/ UNKNOWN
query-hint; 如果你使用:
option (optimize for
(@orderIds unknown))
它會正確地擴充套件到:
option (optimize for
(@orderIds0 unknown, @orderIds1 unknown, @orderIds2 unknown, @orderIds3 unknown))