2012-04-26 2 views
0

코드가 2 ~ 4 자로 시작하고 그 다음에 숫자가있는 공백이있을 수있는 열이있는 테이블이 있습니다. 예 : KR123 또는 KS 23 또는 K23456. SQL Server 2008의 다음 SQL 코드는 숫자를 반환합니다 : 이것은 SQL에서 잘 작동하지만 함께 일하는 프로그래머 중 하나가 같은 일을 Entites에 LINQ를 사용하고 싶어Linq to 엔티티 및 컬럼 반전

Select CONVERT(int, Reverse(LEFT(REVERSE(codefield),PATINDEX('%[a-z]%', REVERSE(codefield)) - 1))) 
From Table1 

. 나는 첫 번째 행에서 반전 된 필드의 인덱스 값을 얻을 수 있다면 바로 볼 수 VB.Net에서이 코드를 시도 :

Dim theResult = theContext.Table1.select(function(y) 
       System.Data.Objects.SQLClient.SQLFunctions.PatIndex("%[a-z]%", y.codefield.Reverse) 
         ).FirstOrDefault 

그것은 잘 컴파일하지만 실행시이 나에게 오류를 제공합니다 : LINQ를에 엔터티가 'System.Collections.Generic.IEnumerable 1[System.Char] Reverse[Char](System.Collections.Generic.IEnumerable 1 [System.Char]'메서드를 인식하지 못하고이 메서드를 저장소 식으로 변환 할 수 없습니다.

. 제가 제거하면, 작동하지만 코드가 올바로 작동하도록 열 데이터를 역전시킬 수 있어야합니다.

LINQ to Entities를 사용하여 원래 선택을 수행하는 방법을 알아낼 수 있습니까?

감사합니다, NCGrimbo

+0

'theContext.ExecuteStoreQuery'를 사용하는 것이 가장 쉬운 경우 일 수 있습니다. http://blogs.microsoft.co.il/blogs/gilf/archive/ 2009/11/25/execute-t-sql-statements-in-entity-framework-4.aspx – mellamokb

답변

1

당신은 왜 그냥 텍스트 대신의 수에 일치하지 않는 번호가 필요한 경우 -이 같은 :

SELECT SUBSTRING(Name, PATINDEX('%[0-9]%', Name), 200) 
FROM Entities 

(200 (또는 무엇이든 번호 스위트 룸을 - T-SQL의 Int.Max가 있습니다. 문자열의 길이를 계산하지 않는 것은 임의적입니다. 길이가 문자열보다 크면 시작 부분에서 시작하는 전체 부분 문자열이 반환됩니다)

이제 L에서의 질의 엔티티에 INQ는 (C#을 사용 죄송합니다) 아주 간단합니다 : 엔티티 프레임 워크는 문자열 길이를 계산하는 코드를 가지고 올 것

var q = ctx.Table1.Select(y => 
      y.codefield.Substring(
       (int)SqlFunctions.PatIndex("%[0-9]%", y.codefield) - 1)); 

참고. 이 같은 임의의 큰 숫자와 트릭을 사용하여 다시 피할 수 있습니다 : 원래의 질문에

var q = ctx.Table1.Select(y => 
      y.codefield.Substring(
       (int)SqlFunctions.PatIndex("%[0-9]%", y.codefield) - 1, 
       Int.Max)); 

- 당신은 조금 다른 방식으로하지만, 반전을 사용할 수 있습니다

var q = ctx.Table1. 
      Select(y => 
       SqlFunctions.PatIndex("%[a-z]%", EntityFunctions.Reverse(y.codefield))); 
0

당신이 할 수있는