어떻게 여러 개의 LIKE를 사용하여 쿼리를 만들면 더 이상 캐시에 메모리 문제가 발생하지 않습니까?

.net asp.net-mvc c# dapper sql

문제

Dapper를 사용하여 SQL 데이터베이스 작업을하고 있습니다. 내 웹 사이트 프로젝트에 검색 논리가 있습니다.

내 검색 문자열 매개 변수 목록을 가져옵니다.

//filter is list of strings

var sql = new StringBuilder();
sql.Append("SELECT LibraryDocumentId FROM LibraryDocumentKeywords WHERE ");

sql.Append(string.Join("OR ", filter.Select(f => string.Format("LOWER(Keyword) LIKE '%{0}%'", f)).ToList()));

var isList = conn.Query<int>(sql.ToString()).ToList();

실제로 Dapper는 모든 단일 쿼리를 캐시하기 때문에이 동적 SQL 쿼리 생성 방법을 사용하고 싶지 않습니다. 매개 변수로 필터를 전달하는 것이 좋습니다. 누군가가 저를 도울 수 있습니까? 어떤 생각?

수락 된 답변

현재 SQL 인젝션 위험이 너무 큽니다. 여기에 DynamicParameters 를 사용할 수 있습니다. 즉, (완전히 테스트되지 않았으므로 약간 조정해야 할 수도 있습니다.)

var sql = new StringBuilder(
    "SELECT LibraryDocumentId FROM LibraryDocumentKeywords");
int i = 0;
var args = new DynamicParameters();
foreach(var f in filter) {
    sql.Append(i == 0 ? " WHERE " : " OR ")
        .Append("LOWER(Keyword) LIKE @p").Append(i);
    args.Add("p" + i, "%" + f + "%");
    i++;
}
var data = conn.Query<int>(sql.ToString(), args);

이것은 상당히 깨끗하게 캐시해야합니다 (내용에 관계없이 필터 수 당 하나의 캐시 항목).



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.