우리가 사용하고있는 코드는 검색 쿼리의이 부분에 솔직하다 :NHibernate 기준을 사용하여 LIKE 절을 이스케이프하려면 어떻게해야합니까?
myCriteria.Add(
Expression.InsensitiveLike("Code", itemCode, MatchMode.Anywhere));
이 프로덕션 환경에서 잘 작동합니다.
고객 중 한 명이이 쿼리와 일치해야하는 % 기호가 포함 된 항목 코드가 있습니다. 이 코드의 결과 SQL 출력은 다음과 유사합니다.
SELECT ... FROM ItemCodes WHERE ... AND Code LIKE '%ItemWith%Symbol%'
이는 항목 검색에서 왜 이상한 결과가 발생하는지 분명하게 설명합니다.
프로그래밍 방식 Criteria
방법을 사용하여 이스케이프를 사용하도록 설정하는 방법이 있습니까?
부록 : 우리는 2.1.0.4000 (글을 쓰는 현재는 2.1.2.4853입니다) NHibernate에의 약간 이전 버전을 사용하고,하지만 난 릴리스 노트를 확인하고 있었다
없음 이것에 대한 수정에 대한 언급. 나는 그들의 bugtracker 중 어떤 미해결 문제도 발견하지 못했습니다.
우리는 특수 문자 (%, _, [, and ^)를 매우 쉽게 이스케이프 처리 할 수 있도록 SQL Server를 사용하지만 NHibernate를 사용하는 요점은 응용 프로그램을 데이터베이스 엔진과 무관하게 만드는 것입니다 가능한 한 많이.
도 HqlQueryUtil.GetLikeExpr()
도 입력을 이스케이프 처리하지 않으며 MatchMode
매개 변수를 제거하면 이스케이프 처리가 적용됩니다.
업데이트 : 나는 someone else이 같은 일을 (3 년 전) 할 역부족, 해상도 (이에 "고정"하고 내가 위에서 언급 한 방법에 escapeChar
과부하를 추가했다 버전 2.0.0.3347). 나는 그 문제에 대한 의견을 추가로 해결할 것을 요구했다.
제이미, 도와 줘서 고마워. 내가 찾고있는 것이 존재하지 않는 것 같습니다 (질문 본문에 대한 내 업데이트 참조). 당신이 여기서 한 접근법은 내가 취할 방법입니다. 나는이 대답을 현재 받아 들일 것이며, NHibernate의 저자가 어떤 일을하기로 결정했다면, 나는 그 때이 문제를 다시 검토 할 것이다. –
향후 방문자 : .NET 4를 사용하면 간단히'return @ "\"+ string.Join (@ "\", value.ToCharArray())'를 사용할 수 있습니다. 더 깨끗하고 나은 성능. – Bergius
빈 문자열을 "\\"로 변환하지 않습니까? – Tobias