0

コードが2〜4文字で始まる文字列であり、スペースがある場合とない場合があり、数値がある列を持つテーブルがあります。例:KR123またはKS23またはK23456。SQL Server 2008の次のSQLコードは、数値のみを返します。

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

これはSQLでうまく機能しますが、私が一緒に仕事をしているプログラマーの1人は、LINQtoEntitesを使用して同じことをしたいと考えています。最初の行から反転フィールドのインデックス値を取得できるかどうかを確認するために、VB.Netでこのコードを試しました。

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

正常にコンパイルされますが、実行時にエラーが発生します。LINQtoEntitiesはメソッド'System.Collections.Generic.IEnumerable 1[System.Char] Reverse[Char](System.Collections.Generic.IEnumerable1 [System.Char])'メソッドを認識せず、このメソッドをストア式に変換できません。 。

.Reverseを削除すると機能しますが、コードが正しく機能するには、列データを逆にすることができる必要があります。

LINQ to Entitiesを使用して元の選択を行う方法を誰かが理解できますか?

ありがとう、NCGrimbo

4

2 に答える 2

1

数字が必要な場合は、テキストの代わりに数字を一致させてみませんか?次のようになります。

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

(200(またはT-SQLにInt.Maxがあればいいのですが)は、文字列の長さの計算を処理しないために任意です-長さが文字列よりも大きい場合は、最初から始まるサブ文字列全体位置が返されます)

これで、Linq to Entitiesでのクエリは非常に簡単になりました(C#を使用して申し訳ありません)。

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

Entity Frameworkは、文字列の長さを計算するコードを作成することに注意してください。次のように任意の大きな数でトリックを使用することで、これを再び回避できます。

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)));
于 2012-04-27T18:48:40.257 に答える
0

System.Data.Entity.DbFunctions.Reverse()を使用できます

于 2015-01-19T22:41:03.863 に答える