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?
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)
It is probably easier to bypass LINQ and use an Entity SQL filter:
var query - db.table.Where("TRIM(fieldname) LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"
and the type of query
implements IQueryable<TEntity>
so you can apply further LINQ operators.
Just to clarify Ladislav's comment regarding it.BusinessName
. I think what he is referring to is prefixing the field name with .it
. The above solution works as long as you prefix the field name in the where clause with it.
. Also I didn't need the TRIM() in my case.
var query - db.table.Where("it.fieldname LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"
It worked perfectly against an Oracle database.
来源:https://stackoverflow.com/questions/7689284/linq-to-entities-ef-4-1-how-to-do-a-sql-like-with-a-wildcard-in-the-middle