Linq 中的 IsNumeric 等效项

Posted

技术标签:

【中文标题】Linq 中的 IsNumeric 等效项【英文标题】:IsNumeric equivalent in Linq 【发布时间】:2012-08-16 15:18:49 【问题描述】:

我需要在 Linq 中使用与 SQL 中的 IsNumeric 函数等效的函数。我想要做的是获取与常见模式匹配的代码。代码应该是唯一的,它们是由代码生成的。模式是这样的:

ABCD0000001 ABCD0000002 ...

但随后用户可以修改代码并在生成的代码中的任何位置输入任何字符(当然,之后我会检查代码的唯一性,但这是出于兴趣)。所以数据库中的记录可以是

ABCD0000001 ABCD00000T01 ABCDT0000002 ..等等。

我想要的是获取最后一个以编程方式生成(不是由用户操作)的代码并检索最后一个数字,这样我就可以将它加 1,从而得到唯一的代码。 (所以最后一个自动生成的代码是 ABCD0007865 那么新代码应该是 ABCD0007866)

我试过了

var lastCode = (
    from c in sedc.Codes
    where SqlMethods.Like(c.Code, "ABCD" + "%")
    where Int64.TryParse(c.Code.Substring(3,10),out t)
    orderby c.Code descending
    select c)
    .FirstOrDefault();

但是这段代码抛出了一个异常说 NotSupportedException:方法 'Boolean TryParse(System.String, Int32 ByRef)' 不支持对 SQL 的转换。"

我该怎么办?我的方法是不是太复杂了?有没有更聪明的方法? 提前致谢。

【问题讨论】:

T-SQL IsNumeric() and Linq-to-SQL的可能重复 用户定义函数的存储过程是这里的路。 【参考方案1】:

这应该可行:

var lastCode = (
    from c in sedc.Codes
    where SqlMethods.Like(c.Code, "ABCD[0-9][0-9][0-9][0-9][0-9][0-9][0-9]")
    orderby c.Code descending
    select c)
    .FirstOrDefault();

【讨论】:

@GertArnold 正如您从 OP 的问题 (where Int64.TryParse(c.Code.Substring(3,10), out t)) 中看到的那样,他只想选择遵循 ABCD 模式和 7 位数字的代码。

以上是关于Linq 中的 IsNumeric 等效项的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 Jaxb 等效项

C# linq 的 Java/Android 最佳等效项 [重复]

T-SQL IsNumeric()和Linq-to-SQL

用于 XML 文件持久性的 LINQ to SQL 等效项

Java 等效于 C# Linq 中的 Where 子句

等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码