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

Zac*_*ott 18 c# linq-to-entities sql-server-2005 entity-framework-4.1

我想搜索一下:

Post Cereal
Run Code Online (Sandbox Code Playgroud)

得到这个:

Post Honey Nut Cereal
Run Code Online (Sandbox Code Playgroud)

那里的外卡是空格.

我知道我可以为每个术语做一个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) );
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Jef*_*ata 46

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

dt.Table.Where(p => SqlFunctions.PatIndex(term, p.fieldname) > 0);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • EF 4.0 不支持`SqlFunctions.PatIndex` - 我得到一个不支持的异常。 (2认同)

Ric*_*ard 5

绕过LINQ并使用Entity SQL过滤器可能更容易:

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

query实现的类型,IQueryable<TEntity>以便您可以应用更多的LINQ运算符.