2015-01-27 2 views
0

LINQ to SQL을 사용하여 (*,?) 와일드 카드 검색 Functionlity를 구현하려고합니다. 현재 우리가 작성한 코드는 짧고 쉽게 관리 할 수 ​​있으므로 정규 표현식을 사용하여 시험해보고 싶습니다. 여기에 지금람다 식을 사용한 정규 표현식 일치

string kw=_keyword.Replace("*",".*").Replace("?","."); 
     var predicate = PredicateBuilder.True<DAL.RequestAttribute>(); 
     Regex reg=new Regex("^"+kw+"$"); 
     predicate=predicate &&(reg.IsMatch(ra=>ra.AttributeValue)); 

이 무엇인가, 여기가 내가 그것을 할 경우 몇 가지 해결 방법 비록

"그것은 대리자 형식이 아니기 때문에 '문자열을'입력 람다 식을 변환 할 수 없습니다"로 컴파일 오류를 제공합니다 컴파일하고 실행하면이 런타임 오류가 발생합니다.

"방법 '부울 IsMatch (System.String)'에 SQL에 대한 변환이 지원되지 않습니다."

그래서 여기에 두 개의 질문이 있습니다. 1. 정규식을 사용하여 와일드 카드를 구현하기 위해 오른쪽 차선에서 생각하고 있습니까? 그렇지 않다면, 어떤 방법이 더 효율적입니까? 2.이 오류를 해결하는 방법.

감사

답변

0

당신은 SqlMethods.Like를 사용하여 SQL의 LIKE 연산자를 모방 수 : https://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like%28v=vs.110%29.aspx.

적절한 와일드 카드/토큰을 사용하십시오 : https://msdn.microsoft.com/en-us/library/ms179859.aspx.

업데이트 : 간단한 SQL에서 정규 표현식을 사용할 수 없습니다. 기본적으로 LINQ를 통해 SQL 문을 작성하기 때문에 동일한 규칙이 적용됩니다. 하지만 제공 한 샘플 코드로 LINQ를 두드리고있는 곳은 아직 명확하지 않습니다.

나는 일반적으로 다음과 같은 것을 볼 것으로 예상 것 :

var results = 
    from Something in SomeLinqContext 
    where SqlMethods.Like(Something.Value, kw); 
+0

첫 번째 오류가 다시 나타나기 때문에이 SQL과 같은 방법도 작동하지 않습니다. 여기에 문자열 kw = _keyword.Replace ("*", "%")를 시도한 코드가 있습니다. Replace ("?", "_"); var predicate = PredicateBuilder.True (); Regex reg = new Regex ("^"+ kw + "$"); 술어 = 술어 && (System.Data.Linq.SqlClient.SqlMethods.Like ((ra => ra.AttributeValue), kw)); 내가 말한대로 마지막 줄에 오류가 발생합니다 ... –

+0

뭔가 명확하게 내 대답을 업데이 트하십시오. – ventaur

+0

더 수동 처리에서 "*"문자열 []에 대해 다음과 같은 코드가 있습니다. [] _searchParts = _keyword.Split ('*'); 경우 (_searchParts.Length == 2) { 경우 (string.IsNullOrEmpty (_searchParts [0])) { 경우 (_fieldName == NULL) 술어 = (RA => ra.AttributeValue.EndsWith (_searchParts [ 1]) && ra.Attribute.LibID == _libID); else 술어 = (ra => ra.AttributeValue.EndsWith (_searchParts [1]) && ra.Attribute.LibID == _libID && ra.Attribute.Name == _fieldName); }이 작동합니다. 그리고 "http : //www.albahari"에서 Predicatebuilder 클래스를 사용하고 있습니다.com/expressions " –

0

을 내 질문에 대한 답을 발견 몇 가지 조사 후. 제안에 대한 Ventaur에게 감사드립니다. 솔루션은 비슷한 선상에 있지만 조금 다릅니다. PFB는

string kw=_keyword.Replace("*","%").Replace("?","_"); 
var predicate = PredicateBuilder.True<DAL.RequestAttribute>(); 
predicate = (ra => SqlMethods.Like(ra.AttributeValue, kw) && <Any other boolean conditions> 

의 코드는 그러므로 우리의 술어 빌더 클래스를 사용하여 SQLMethods.like 방법에서 식을 만드는 방법으로 요약된다.