【发布时间】:2021-10-27 04:57:02
【问题描述】:
短版
我想在字符串数据类型中搜索“1000000”和“1009999”之间的所有数字,并且需要对 LINQ 查询进行 SQL 优化。
加长版
我看到很多关于“Contains()”、“StartsWith()”和“EndsWith()”的帖子,但没有一个数字比较。
我想要的是相当于 SQL like '100____',但它必须是全数字,因此是 like '100[0-9][0-9][0-9][0-9]'。 (数据类型为字符串,可以包含非数字数据。)
什么是 LINQ 等价物,也经过 SQL 优化,以验证字符串值是否只是数字?
我试过.Where(p => p.Value >= "1000000" && p.Value < "1010000"),但不接受对字符串的比较(它会产生编译错误)。
这必须与 .NET Core 兼容,所以像 SqlMethods.Like() 和 SqlFunctions.IsNumeric() 这样的 .NET Framework 解决方案已经过时了。
【问题讨论】:
-
This 答案可能有用
-
如果 p.Value 是数字类型,请删除示例代码数字周围的双引号。但是,如果 p.Value 是字符串类型,您也必须将其解析为 Int。
-
我认为这取决于您使用的数据库提供商。对于 Npgsql EF Core,您可以使用如下内容:stackoverflow.com/a/66214435/6593177
-
.NET Core 根本没有 LINQ to SQL 实现(如
System.Data.Linq),即使在框架上也已被弃用很长时间,所以不太清楚你的问题是什么(除非您的问题只是提到“SQL”以供参考,并且实际上不涉及 SQL,因为您使用的是 LINQ to Objects)。处理 SQL 的 Core 上最常见的 LINQ 提供程序可能是 Entity Framework Core,它确实具有Like操作 (EF.Functions.Like)。答案必然是特定于提供者的,因为没有一种语言结构可以以这种方式规范地映射到 SQL。 -
@PeetBrits 正如 Jeroen Mostert 解释的那样,您可以使用 ORM 的
Like函数。 LINQ 本身不是 ORM,它是一种在其他提供程序之上使用的语言,例如内存对象和 ORM。你在使用 NHibernate 吗?实体框架?实体框架核心?你试过使用EF.Functions.Like 吗?