Linq to Entities(EF 4.1):如何使用中间的通配符(’%term%term%’)执行SQL LIKE?
我想搜索一下:
Post Cereal
得到这个:
Post Honey Nut Cereal
那里的外卡是空格。
我知道我可以为每个术语做一个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) );
有什么建议?
我相信你可以使用SqlFunctions.PatIndex :
dt.Table.Where(p => SqlFunctions.PatIndex(term, p.fieldname) > 0);
SqlFunctions.PatIndex的行为与SQL LIKE运算符相同。 它支持所有标准通配符,包括:
- %任何零个或多个字符的字符串。
- _ (下划线)任何单个字符。
- []指定范围内的任何单个字符([af])或set([abcdef])。
- [^]任何不在指定范围([^ af])或集合([^ abcdef])内的单个字符。
当SqlMethods.Like不可用时(包括在MVC控制器中),SqlFunctions.PatIndex通常可用
绕过LINQ并使用Entity SQLfilter可能更容易:
var query - db.table.Where("TRIM(fieldname) LIKE @pattern"); query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"
并且query
类型实现了IQueryable
因此您可以应用更多LINQ运算符。
只是为了澄清Ladislav关于it.BusinessName
的评论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%"
它与Oracle数据库完美配合。
- 防止在浏览器刷新时重新提交webform,而不会丢失viewstate
- SqlTransaction中的SqlDataAdapter.Fill() – 这是一个不好的做法吗?
- FacebookApplication.VerifyAuthentication(_httpContext,GenerateLocalCallbackUri())在Facebook上返回null
- 如何使用DataContract添加XML属性
- WebClient异步下载文件时检测连接丢失(在C#中)
- Tesseract OCR库 – 学习字体
- 使用C#winform的zeromq pub / sub示例
- 更改我的服务器端WebAPI以获得async / await的好处
- 合并资源字典