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 - остальные два являются псевдопараметрами, которые фактически не изменятся. Часто РСУБД могут лучше работать, если обнаруживают их как константы. Для этого 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 });

Dapper заменяет значения литералами перед выпуском SQL, поэтому СУБД фактически видит что-то вроде:

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

Это особенно полезно, когда RDBMS-системы не просто принимают более правильные решения, а открывают планы запросов, которые предотвращают фактические параметры. Например, если предикат столбца относится к параметру, тогда отфильтрованный индекс с определенными значениями в этих столбцах нельзя использовать. Это связано с тем, что следующий запрос может иметь параметр отдельно от одного из указанных значений.

С литеральными значениями оптимизатор запросов может использовать отфильтрованные индексы, так как он знает, что значение не может измениться в будущих запросах.