【问题标题】:Is there a way to use EF.Functions.Like with ESCAPE sql keyword to prevent wildcard有没有办法使用 EF.Functions.Like 和 ESCAPE sql 关键字来防止通配符
【发布时间】:2018-05-04 14:50:16
【问题描述】:

所以我正在对一个表实现一个搜索功能,该表的 varchar 字段包含通常带有简单字符串的文本,但其中一些包含“[文本]”,包括括号。

对于过滤功能,我正在使用实体框架并尝试使用 EF.Functions.Like 之类的:

objects = objects.Where(t => EF.Functions.Like(t.name, "%" + param.Request.Name + "%"));

问题是当 object.name 包含这些括号时,因为它触发了 SQL Charlist 通配符,所以上面返回 0 结果;我找不到任何关于如何将它与 SQL ESCAPE 关键字一起使用的信息,如下所示:

...WHERE NAME LIKE '%PRETEXT_\[TEXT\]%' ESCAPE '\'

上面的语句返回任何包含 PRETEXT_[TEXT] 的结果

有什么办法可以对这些使用 ESCAPE,这样我就可以转义 '[' + ']' 字符,或者用另一种/更好的方式来处理这类事情?

【问题讨论】:

  • [[] 转义打开[ 并且您不需要转义关闭],例如'%Tariff [[]Account]%' 找到包含“关税 [帐户]”的任何内容。
  • 我总是忘记.. 但是t.name.Contains(param.Request.Name) 不起作用吗?
  • 正如 JamieD77 所说,Contains 也可以在这种情况下工作,并且不涉及字符串操作。我已经接受了一个专门与 EF.Functions.Like 相关的答案,并在下面提供了一个示例,如果其他人在这里绊倒的话。谢谢。

标签: c# sql .net sql-server entity-framework


【解决方案1】:

根据文档:

public static bool Like (this Microsoft.EntityFrameworkCore.DbFunctions _, string matchExpression, string pattern, string escapeCharacter);

您可以添加转义字符作为附加参数。

就像 JamieD77 所说,包含在没有字符串操作的情况下应该也能正常工作。

【讨论】:

  • param.Request.Name = param.Request.Name.Replace("[", "\\["); param.Request.Name = param.Request.Name.Replace("]", "\\]"); objects = objects.Where(t => EF.Functions.Like(t.name, "%" + param.Request.Name + "%", "\\")); 似乎有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多