链接到实体(EF 4.1):如何在中间使用通配符('%term%term%')做一个SQL LIKE
本文关键字:%term%term% LIKE SQL 一个 通配符 EF 实体 链接 在中间 | 更新日期: 2023-09-27 18:10:37
我要搜索这个:
Post Cereal
得到这个:
Post Honey Nut Cereal
通配符将是空格。
我知道我可以做一个SPLIT和一系列的and和Contains()和翻译为Linq表达式为每个术语作为一个规范对象,但不是有一种方式来尊重通配符在术语发送到SQL?我看了SQL函数,它是在Linq到SQL,但我不确定它是在Linq到实体。
我想这样做:
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操作符相同。它支持所有标准通配符,包括:
- %任意0个或多个字符的字符串。
- _(下划线)任意单个字符。
- []指定范围([a-f])或集合([abcdef])内的任何单个字符。
- [^]任何不在指定范围([^a-f])或集合([^abcdef])内的单个字符。
SqlFunctions。PatIndex通常在SqlMethods。Like不可用(包括在MVC控制器中)
可能更容易绕过LINQ而使用实体SQL过滤器:
var query - db.table.Where("TRIM(fieldname) LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"
和query
的类型实现了IQueryable<TEntity>
,因此您可以应用进一步的LINQ操作符
澄清Ladislav关于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%"