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는 이것을 상수로 감지하면 더 나은 작업을 수행 할 수 있습니다. 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을 실행하기 전에 값을 리터럴로 대체하므로 RDBMS는 실제로 다음과 같이 표시됩니다.

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

이는 특히 RDBMS 시스템이 더 나은 결정을 내리는 것이 아니라 실제 매개 변수가 방지하는 쿼리 계획을 열 때 유용합니다. 예를 들어, 컬럼 술어가 매개 변수에 대 한 경우, 해당 컬럼에 특정 값을 갖는 필터링 된 인덱스를 사용할 수 없습니다. 이는 다음 질의에 지정된 값 중 하나와 다른 매개 변수가있을 수 있기 때문입니다.

리터럴 값을 사용하면 쿼리 최적화 프로그램은 필터링 된 인덱스를 사용할 수 있습니다. 이후의 쿼리에서 값을 변경할 수 없다는 것을 알고 있기 때문입니다.