Linq to Entities(EF 4.1):如何使用中间的通配符(’%term%term%’)执行SQL LIKE?

我想搜索一下:

Post Cereal 

得到这个:

 Post Honey Nut Cereal 

那里的外卡是空格。

我知道我可以为每个术语做一个SPLIT和一系列ANDs和Contains()并转换为Linq Expression作为规范对象,但是在发送给SQL的术语中是不是有办法表示通配符? 我查看了Linq to SQL中的SQL函数,但我不确定它在Linq to Entities中是什么。

我想做这样的事情:

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

有什么建议?

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

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

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

  • 任何零个或多个字符的字符串。
  • _ (下划线)任何单个字符。
  • []指定范围内的任何单个字符([af])或set([abcdef])。
  • [^]任何不在指定范围([^ af])或集合([^ abcdef])内的单个字符。

当SqlMethods.Like不可用时(包括在MVC控制器中),SqlFunctions.PatIndex通常可用

绕过LINQ并使用Entity SQLfilter可能更容易:

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

并且query类型实现了IQueryable因此您可以应用更多LINQ运算符。

只是为了澄清Ladislav关于it.BusinessName的评论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%" 

它与Oracle数据库完美配合。