Looking for dapper Keywords? Try Ask4Keywords

Dapper.NET 價值內聯


有時,參數的便利性(在維護和表現力方面)可能會被其性能成本所抵消,以將其作為參數對待。例如,當頁面大小由配置設置修復時。或者狀態值與enum值匹配。考慮:

var orders = connection.Query<Order>(@"
select top (@count) * -- these brackets are an oddity of SQL Server
from Orders
where CustomerId = @customerId
and Status = @open", new { customerId, count = PageSize, open = OrderStatus.Open });

這裡唯一真正的參數是customerId - 另外兩個是偽參數,實際上不會改變。如果將RDBMS檢測為常量,RDBMS通常可以做得更好。 Dapper有一個特殊的語法 - {=name}而不是@name - 它只適用於數字類型。 (這可以最大限度地減少SQL注入的任何攻擊面)。一個例子如下:

var orders = connection.Query<Order>(@"
select top {=count} *
from Orders
where CustomerId = @customerId
and Status = {=open}", new { customerId, count = PageSize, open = OrderStatus.Open });

在發出SQL之前,Dapper用文字替換值,因此RDBMS實際上看到如下內容:

select top 10 *
from Orders
where CustomerId = @customerId
and Status = 3

當允許RDBMS系統不僅做出更好的決策,而且打開實際參數阻止的查詢計劃時,這尤其有用。例如,如果列謂詞針對參數,則不能使用在該列上具有特定值的篩選索引。這是因為下一個查詢可能具有與這些指定值之一不同的參數。

使用文字值,查詢優化器能夠使用篩選的索引,因為它知道在將來的查詢中值不會更改。