列表扩展

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