development

Dapper는 like 연산자를 지원합니까?

big-blog 2020. 12. 29. 08:22
반응형

Dapper는 like 연산자를 지원합니까?


Dapper-dot-net 사용 ...

다음은 데이터 개체에서 결과를 생성하지 않습니다.

var data = conn.Query(@"
    select top 25 
    Term as Label, 
    Type, 
    ID 
    from SearchTerms 
    WHERE Term like '%@T%'", 
    new { T = (string)term });

그러나 다음과 같은 일반 문자열 형식을 사용할 때 :

string QueryString = String.Format("select top 25 Term as Label, Type, ID from SearchTerms WHERE Term like '%{0}%'", term);
var data = conn.Query(QueryString);

컬렉션에서 25 행을 다시 얻습니다. Dapper가 매개 변수의 끝을 올바르게 구문 분석하지 @T않습니까?


시험:

term = "whateverterm";
var encodeForLike = term => term.Replace("[", "[[]").Replace("%", "[%]");

string term = "%" + encodeForLike(term) + "%";
var data = conn.Query(@"
   select top 25 
  Term as Label, 
  Type, 
  ID 
  from SearchTerms 
  WHERE Term like @term", 
  new { term });

같은 연산자에 대해 특별한 것은 없습니다. 문자열 리터럴 안에 매개 변수를 넣는 것을 절대 원하지 않습니다. 작동하지 않고 대신 문자열로 해석됩니다.

노트

두 번째 스 니펫의 하드 코딩 된 예제는 SQL 인젝션에 큰 문제가 될뿐만 아니라 dapper가 누출 될 수 있습니다.

경고

모든 like와일드 카드로 선도 경기는 느리고 인덱스 스캔이 필요합니다 즉, 스 SARGable 없습니다.


이것을 사용하여 쿼리에 concat 함수를 추가하는 가장 좋은 방법은 SQL 주입에도 저장되지만 concat 함수는 SQL 2012 이상에서만 지원됩니다.

string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});

네 그렇습니다. 이 간단한 솔루션은 매번 저에게 효과적이었습니다.

db.Query<Remitente>("SELECT * 
                     FROM Remitentes 
                     WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
                   .ToList();

Sam의 대답은 나를 위해 작동하지 않았으므로 몇 가지 테스트 후 작동하는 것처럼 보이는 SQLite CONCAT 등가물 을 사용했습니다.

string sql = "SELECT * FROM myTable WHERE Name LIKE '%' || @NAME || '%'";
var data = IEnumerable data = conn.Query(sql, new { NAME = Name });

참조 URL : https://stackoverflow.com/questions/6030099/does-dapper-support-the-like-operator

반응형