2013-06-19 2 views
17

나는 LINQ가있는 프로젝트가 있으며이 프로젝트에서 자체 메서드를 사용하려고합니다. 이 NoWhiteSpaces 메서드는 공백없이 위쪽 문자열을 반환해야합니다. 이 같은 엔티티에 LINQ를 사용하는 자체 메서드 사용

public static class LittleExtensions 
{ 
    public static string NoWhiteSpaces(this String s) 
    { 
     return Regex.Replace(s, @"\s", string.Empty).ToUpper(); 
    } 
} 

내가 LINQ와이 방법을 사용하려면

: 엔티티에

LINQ는 방법 '시스템을 인식하지 않습니다

static void GetHaendler() 
    { 
     using (var riaService = new gkmRia()) 
     { 
      var hladany = "someone"; 
      var haendlers = from hndlr in riaService.GetGkmHaendlerOutlet() 
          where hndlr.NameOutlet.NoWhiteSpaces() == hladany.NoWhiteSpaces() 
          select hndlr; 
      Console.Write(haendlers.First().NameOutlet); 
     } 
    } 

는이 오류 메시지가 표시됩니다. String NoWhiteSpaces (System.String) '메서드를 사용하고이 메서드는 저장소 식으로 변환 할 수 없습니다.

모든 솔루션? 시간 내 주셔서 감사합니다.

+0

BezBielychZnakov()는 어디에 있나요? –

+1

linq 호출을 할 때 파일 내부의 네임 스페이스에 "using"절을 추가 했습니까? – Serge

+1

regex :'새 문자열 반환 (s.Where (c =>! char.IsWhitespace (c)))을 사용하지 마십시오.ToUpper()' –

답변

15

LINQ to Entities는 표현식을 사용자의 메서드로 수행 할 수없는 SQL 문으로 변환 할 수 있어야하므로 LINQ to Entities에서 사용자 지정 메서드 나 속성을 사용할 수 없습니다. 이 쿼리를 유발한다는

static void GetHaendler() 
{ 
    using (var riaService = new gkmRia()) 
    { 
     var hladany = "someone"; 
     var haendlers = from hndlr in riaService.GetGkmHaendlerOutlet().AsEnumerable() 
         where hndlr.NameOutlet.NoWhiteSpaces() == hladany.NoWhiteSpaces() 
         select hndlr; 
     Console.Write(haendlers.First().NameOutlet); 
    } 
} 

참고 :

주위를 얻을 수있는 방법이 엔티티에 LINQ를 무시하고 대신 (아래 코드에서 AsEnumerable()주의) Enumerable를 사용하는 대신 Queryable에 의해 객체에 LINQ를 사용하는 것입니다 데이터베이스가 아닌 응용 프로그램에서 실행되므로 성능에 영향을 미칠 수 있습니다. 가능하면 methods supported by the Entity Framework을 사용하여 표현 될 수 있도록 u 리를 변경하는 것이 Y 람직합니다.

로 될 수 엔티티에 LINQ에서 지원하는 다른 표현은 다음과 같습니다

이 예제는 공백과 탭을 (정규식뿐만 아니라 다른 공백 문자를 처리) 처리하지만, 나도 몰라

var hladany = "someone".NoWhiteSpaces(); 
var haenflers = from hndlr in riaService.GetGkmHaendlerOutlet(). 
       where hndlr.NameOutlet.Replace(" ", "").Replace("\t", "") == hladany 
       select hndlr; 
귀하의 정확한 요구 사항은 충분할 수 있습니다. 추가 교체를 수행하기 위해 항상 Replace 전화를 더 연결할 수 있습니다.

+0

대단히 고마워요 :-) 나는 그것을 시도합니다! –

+4

@ a.farkas2508 이렇게하면 클라이언트에서 모든 결과가 처리됩니다. 이 필터를 사용하는 경우 이는 차선책입니다. – Aron

+0

그래서 SQL로 변환 할 수있는 대안을 제공했습니다. 'Replace'를 사용하는 질의는 인덱스를 사용할 수 없기 때문에 여전히 최적은 아닙니다. – Sven

6

LINQ to Entities는 호출 된 모든 메서드를 실행되는 데이터베이스 쿼리의 일부로 변환하려고 시도합니다. 메소드를 변환하려고하면 SQL로 표현하는 방법을 모르기 때문에 실패합니다.

(용량이 큰 데이터 세트를 처리하는 경우 나쁜 생각하지만) 당신은 쿼리를 실행하거나

  • 하여 주위에 얻을 결과를 구체화 후 그것을 필터링 할 수 있습니다, 또는
  • 만 사용 지원 방법 (더 나은 접근 IMO). 현재 지원되는 방법의 목록을 찾을 수 있습니다 String.Replace()String.ToUpper()가 지원하는 방법으로
    CLR Method to Canonical Function Mapping
    을, 그것과 사용자 정의 방법을 쉽게 교체해야합니다.
관련 문제