0

我有一个表,其中有一列代码是一个以 2 到 4 个字符开头的字符串,然后可能有也可能没有空格,然后它有一个数字。例如:KR123 或 KS 23 或 K23456。SQL Server 2008 上的以下 SQL 代码将仅返回数字:

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

这在 SQL 中效果很好,但与我一起工作的一位程序员想要使用 LINQ to Entites 来做同样的事情。我在 VB.Net 中尝试了这段代码,只是想看看是否可以从第一行获取反转字段的索引值:

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

它编译得很好,但是运行时出现错误:LINQ to Entities does not identify the method '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)是任意的,只是为了不处理计算字符串的长度 - 如果长度大于字符串,则整个子字符串从 start 开始位置将被退回)

现在 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));

回到最初的问题 - 您可以使用 Reverse 但方式有所不同:

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 回答