列表扩展
数据库查询中的常见场景是 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))