2012-04-26 17 views
0

私は、コードが2〜4文字で始まり、スペースを持っていてもいなくてもよい文字列であるカラムを持つテーブルを持っています。例:KR123またはKS 23またはK23456。 SQL Server 2008で次のSQLコードは、単に数を返します。これは、SQLで素晴らしい作品が、私が仕事プログラマーの一つは、同じことを行うためにEntitesにLINQを使用したいLinq to Entitiesとカラムを逆転する

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#を使用して申し訳ありません)非常に単純です:Entity Frameworkのは、文字列の長さを計算するコードを考え出すだろうということ

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

をすることができますSystem.Data.Entity.DbFunctions.Reverse()を使用してください。