Looking for dapper Keywords? Try Ask4Keywords

Dapper.NET Waarde inlining


Voorbeeld

Soms kan het gemak van een parameter (in termen van onderhoud en expressiviteit) opwegen tegen de kosten van de prestaties om deze als parameter te behandelen. Bijvoorbeeld wanneer het paginaformaat wordt vastgelegd door een configuratie-instelling. Of een statuswaarde wordt gekoppeld aan een enum . Overwegen:

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 });

De enige echte parameter hier is customerId - de andere twee zijn pseudo-parameters die niet echt zullen veranderen. Vaak kan het RDBMS beter werken als het deze als constanten detecteert. Dapper heeft hiervoor een speciale syntaxis - {=name} plaats van @name - die alleen van toepassing is op numerieke typen. (Dit minimaliseert elk aanvaloppervlak van SQL-injectie). Een voorbeeld is als volgt:

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

Dapper vervangt waarden door letterlijke waarden voordat de SQL wordt uitgegeven, dus het RDBMS ziet eigenlijk iets als:

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

Dit is met name handig wanneer RDBMS-systemen niet alleen betere beslissingen kunnen nemen, maar ook queryplannen kunnen openen die door feitelijke parameters worden voorkomen. Als een kolompredikaat bijvoorbeeld tegen een parameter is, kan een gefilterde index met specifieke waarden voor die kolommen niet worden gebruikt. Dit komt omdat de volgende query een andere parameter kan hebben dan een van die opgegeven waarden.

Met letterlijke waarden kan de queryoptimalisatie gebruikmaken van de gefilterde indexen, omdat het weet dat de waarde niet kan worden gewijzigd in toekomstige query's.