防止EF转义通配符

时间:2011-11-18 18:57:31

标签: entity-framework-4

我有类似的东西

var query = repo.GetQuery(); // IQueryable
query.Where(item => item.FieldName.Contains("xxx%yyy"));

它导致SQL服务器上的以下语句

exec sp_executesql N'SELECT 
// clipped
WHERE ([Extent1].[FieldName] LIKE @p__linq__0 ESCAPE N''~'')',
    N'@p__linq__0 nvarchar(4000),@p__linq__0=N'%xxx~%yyy%'

@p__linq__0=N'%xxx~%yyy%会导致SQL服务器查找xxx%yyy %作为文字(因为它已转义),而我希望它匹配xxx123yyy之类的字符串,{ {1}},xxxABCyyyxxxANYTHINGyyyxxxyyyprefix %的添加很好,但如果需要我可以手动执行。

在上面的例子中,我简化并只编写了一个where条件,但我有一个动态逻辑,用许多这样的关键字构建谓词,我想允许将通配符嵌入到关键字中。有没有办法告诉EF不要逃避搜索关键字中的%?

1 个答案:

答案 0 :(得分:1)

这是不可能的。 Contains("xxx")表示在SQL中需要LIKE '%xxx%'。 Linq-to-entities和它的String映射方法都不提供完整的通配符搜索=任何通配符始终是转义的。如果要使用通配符搜索,则必须使用Entity SQL