2012-11-27 4 views
2

IQueryable 데이터 소스에서 다음 값을 조회하려고합니다.와일드 카드 검색

사용자는 값을 입력하여 Silverlight 응용 프로그램의 텍스트 상자에 결과를 필터링 한 다음 이러한 입력을 필터링하여 내 도메인 서비스로 보낼 수 있습니다.

"*"는 사용자가 와일드 카드 검색을 수행하기 위해 입력 할 수 있으므로 'TYPE'이 "P32"로 시작하는 모든 값을 반환합니다.

List<string> params = new List<string>() { "P32*", "P4552", "P2311" }; 

그때 내 도메인 서비스 코드에서 함수에이 목록을 전달합니다

IQueryable<MyClass> temp = this.ObjectContext.MyClass.AsQueryable(); 
temp = temp.Where(c => params.Contains(c.TYPE)); 

이 내 와일드 카드 검색을 구현하고 싶었 전에 내가 한 것입니다. 이 작업을 수행하는 가장 깨끗한 방법은 무엇입니까? 나는 내 PARAMS 목록을 루프와 같은 뭔가를해야하고 (좀 더 문자열 처리 후) 각 문자열에 포함하려고 거라고 생각하지만 그 방법은, 당신이 필요를이 작업을 수행하기 위해

foreach (string x in params) 
{ 
    //look for * wildcard... do some other stuff 
    temp = temp.Where(c=>c.TYPE.Contains(x)); 
} 
+0

염두에 두어야을 당신의 솔루션 "진짜"와일드 카드 '*'와 같은 와일드 카드 문자를 사용한 매칭은 작동하지 않습니다. "P32 *"는 "P32Whatever"와 일치하지 않지만 "P4552"는 "HelloP4552World"와 일치합니다. 그래도 더 나은 해결책에 대해 생각 ...;) – Spontifixus

+0

나는 단순함을 위해서 그것을 지켰지 만 되돌아 보면 나는 무엇인가를 채찍질해야했다. 다행히도 필자는 입력 내용이 항상 'P'이고 그 다음 4 자리라는 가정을 할 수 있습니다. – user1384831

답변

1

그렇게 더러운 느낌 와일드 카드가 어떻게 작동하는지 완전히 정의하십시오.

public static class WildcardExtensions 
{ 
    public static bool WildcardContains(this IEnumerable<string> patterns, string value) 
    { 
     return patterns.Any(pattern => MatchesWildcard(pattern, value)); 
    } 

    private static bool MatchesWildcard(string pattern, string value) 
    { 
     // implement your pattern matching logic here 
    } 
} 

를 다음 코드는 약간의 변경 : 당신이 그렇게하면, 당신은 다음과 같은 기능에 빈칸을 채울 수

temp = temp.Where(c => params.WildcardContains(c.TYPE)); 
+0

수율로 인해 "Bool이 반복기 인터페이스 유형이 아닙니다"라는 오류가 발생합니다. WildcardContains에 대해 'IEnumerable '을 반환해도 "temp = temp.Where (c => params.WildcardContains (c.TYPE));"를 사용할 수 없습니다. 그것은 하나의 bool을 기대하기 때문에. WildcardContains를 반환하려면 어떻게해야합니까? – user1384831

+0

Opps, 맞아요. 실제로 bool을 반환해야합니다. bool 열거를 반환하지 마십시오. –

+0

글쎄 그걸 고쳤지 만 지금은 디버거에서 임시 결과를 보려고 할 때 "LINQ to Entities가 메서드를 인식하지 못합니다."Boolean WildcardContains (System.Collections.Generic.IEnumerable'1 [System.String], System.String) '메서드를 호출하고이 메서드를 저장소 식으로 변환 할 수 없습니다. "} \t System.SystemException {System.NotSupportedException}"결과를 클래스에 명시 적으로 매핑하더라도이 함수를 사용하여 아무 것도 얻지 못하게합니다. – user1384831