【问题标题】:LINQ equivalent of SQL LIKE for text field with digitsLINQ 等效于 SQL LIKE 用于带有数字的文本字段
【发布时间】: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 吗?

标签: c# linq .net-core


【解决方案1】:

您可以在EF.Functions 类中使用Like 方法

.Where(x => EF.Functions.Like(p.Value, SearchQuery + "%"));

% 将匹配 SearchQuery 值之后的任何值

您可以执行以下操作:

.Where(x => EF.Functions.Like(p.Value, "%" + SearchQuery + "%"));

.Where(x => EF.Functions.Like(p.Value, "%" SearchQuery));

【讨论】:

    【解决方案2】:

    这行得通。

    .Where(p => EF.Functions.Like(p.Value, "100[0-9][0-9][0-9][0-9]"))
    

    感谢cmets中的所有建议!

    【讨论】:

    • 对于Convert(或cast)sql 内置函数是否有任何EF 函数?使用 sql 查询,我会使用 where cast (myFiels as int)...
    • @GianPaolo 我不知道,但即使有,SQL 查询也会中断,因为存在不是数字的有效值。
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2018-05-06
    相关资源
    最近更新 更多