链接到实体(EF 4.1):如何在中间使用通配符('%term%term%')做一个SQL LIKE

本文关键字:%term%term% LIKE SQL 一个 通配符 EF 实体 链接 在中间 | 更新日期: 2023-09-27 18:10:37

我要搜索这个:

Post Cereal

得到这个:

Post Honey Nut Cereal

通配符将是空格。

我知道我可以做一个SPLIT和一系列的and和Contains()和翻译为Linq表达式为每个术语作为一个规范对象,但不是有一种方式来尊重通配符在术语发送到SQL?我看了SQL函数,它是在Linq到SQL,但我不确定它是在Linq到实体。

我想这样做:

term = '%' + term.Replace(' ', '%') + '%';
db.table.where( p => System.Data.Objects.SqlClient.SqlFunctions
                     .SqlMethods.Like(p.fieldname, term) );

有什么建议吗?

链接到实体(EF 4.1):如何在中间使用通配符('%term%term%')做一个SQL LIKE

我相信你可以使用SqlFunctions。PatIndex:

dt.Table.Where(p => SqlFunctions.PatIndex(term, p.fieldname) > 0);

SqlFunctions。PatIndex的行为与SQL LIKE操作符相同。它支持所有标准通配符,包括:

  • %任意0个或多个字符的字符串。
  • _(下划线)任意单个字符。
  • []指定范围([a-f])或集合([abcdef])内的任何单个字符。
  • [^]任何不在指定范围([^a-f])或集合([^abcdef])内的单个字符。

SqlFunctions。PatIndex通常在SqlMethods。Like不可用(包括在MVC控制器中)

可能更容易绕过LINQ而使用实体SQL过滤器:

var query - db.table.Where("TRIM(fieldname) LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"

query的类型实现了IQueryable<TEntity>,因此您可以应用进一步的LINQ操作符

澄清Ladislav关于it.BusinessName的评论。我想他指的是用.it作为字段名的前缀。只要在where子句中为字段名加上it.前缀,上述解决方案就可以工作。在我的例子中,我也不需要TRIM()。

var query - db.table.Where("it.fieldname LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"