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

后端 未结 3 1546
陌清茗
陌清茗 2021-01-01 16:04

I want to search for this:

Post Cereal

and get this:

Post Honey Nut Cereal

where the wild cards would be

相关标签:
3条回答
  • 2021-01-01 16:15

    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.

    0 讨论(0)
  • 2021-01-01 16:23

    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.

    0 讨论(0)
  • 2021-01-01 16:27

    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)

    0 讨论(0)
提交回复
热议问题