Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq to Entities (EF 4.1): How to do a SQL LIKE with a wildcard in the middle ( '%term%term%')?

I want to search for this:

Post Cereal

and get this:

Post Honey Nut Cereal

where the wild cards would be the spaces.

I know I could do a SPLIT and a series of ANDs and Contains() and translation to a Linq Expression for each term as a specification object, but isn't there a way to honor wildcards in the term sent to SQL? I looked at SQL functions where it's in Linq to SQL, but I am not sure what it is in Linq to Entities.

I would like to do something like this:

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

Any suggestions?

like image 884
Zachary Scott Avatar asked Oct 07 '11 15:10

Zachary Scott


1 Answers

I believe you could use SqlFunctions.PatIndex:

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

SqlFunctions.PatIndex behaves the same as the SQL LIKE operator. It supports all standard wildcard characters including:

  • % Any string of zero or more characters.
  • _ (underscore) Any single character.
  • [ ] Any single character within the specified range ([a-f]) or set ([abcdef]).
  • [^] Any single character not within the specified range ([^a-f]) or set ([^abcdef]).

SqlFunctions.PatIndex is often available when the SqlMethods.Like is not available (including within MVC controllers)

like image 102
Jeff Ogata Avatar answered Oct 05 '22 06:10

Jeff Ogata