2009-11-23 3 views
1
public ActionResult Index(string title) 
    { 
     var post = (from p in dataContext.Posts 
        where RemoveChar(p.Title) == title && !p.Deleted 
        select p).Single(); 

     post.Visit = post.Visit + 1; 

     dataContext.SubmitChanges(); 

     return View(new ViewData.PostIndexViewData(post)); 
    } 

    public string RemoveChar(string Item) 
    { 
     var s = from ch in Item 
       where !Char.IsPunctuation(ch) 
       select ch; 
     var bytes = UnicodeEncoding.ASCII.GetBytes(s.ToArray()); 
     var stringResult = UnicodeEncoding.ASCII.GetString(bytes); 
     return stringResult; 
    } 

'System.String RemoveChar (System.String)'메서드는 SQL에 지원되는 변환이 없습니다.Linq2Sql remove char

+0

내가 완성되기 전에 미안하다. P – John

답변

1

아니요, LINQ 내에서 SQL에 사용자 지정 메서드를 사용할 수 없습니다. SQL로 변환하는 방법을 알지 못합니다. (표현식 트리에는 RemoveChar에 대한 호출이 포함되어 있습니다. RemoveChar의 코드를 표현하는 표현식 트리를 작성하지 않습니다.) 특별히 좋은 방법이 있는지 확신하지 못합니다. 코드를 작성할 수 있습니다. 사용자 정의 함수 또는 저장 프로 시저 및 LINQ에 적절하게 매핑합니다. (젠체, SQL Server를 사용하고 DBA가있는 경우 CLR 사용자 정의 함수를 사용할 수 있습니다.)

RemoveChar 구현이 몇 가지면에서 이상적이라고 생각합니다. 처리중인 구두점 제거의 경우 대신 Regex.Replace

+0

그리고 메인 Linq 쿼리에'Regex.Replace'를 추가해야할까요? 다른 기능으로 포장하지 않습니까? –

+0

@cottsak : LINQ to SQL 번역에서 Regex.Replace가 지원되는 것은 의심 스럽습니다. 그것은 가능하지만,있을 법하지 않습니다. 시도할만한 가치가 있다고 생각합니다. –

0

문제는 로컬 함수를 Linq에서 SQL로 변환하여 서버로 보내려는 Linq 식으로 혼합하는 것입니다.

이 문제를 해결하려면 게시물의 전체 목록을로드하고 메모리에 결과를 쿼리해야합니다.이 결과는 아마도 이상적이지 않습니다.

응용 프로그램을 변경해야한다고 생각합니다. 데이터베이스의 데이터가 일치하도록 수정하지 않아도되는 키를 사용하여 데이터베이스를 검색 할 수 있어야합니다.

귀하의 예제에 따라 구두점이 제거 된 제목 인 "SearchTitle"열을 추가 한 다음 귀하의 질의가 약간의 추가 공간을 들여 사소한 (그리고 더 효율적인) 데이터 베이스.