2011-11-18 71 views
2

我有这样的事情防止EF逃逸通配符

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,xxxABCyyy,xxxANYTHINGyyy,xxxyyy等等。prefix %suffix %是好的,但我可以手动做到这一点,如果需要。

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

回答

1

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

+0

谢谢。我找到了相关的问题,但希望可能有新的东西。我正在使用ExecuteStoreQuery和手工制作的SQL以及参数。早些时候,我使用PredicateBuilder进行静态绑定,并不是所有东西都是字符串:( –

+1

@amit_g:如果你正在使用SQL Server,那么有一个解决方法('SqlFunctions.PatIndex')允许你使用LINQ查询:http:/ /stackoverflow.com/questions/6202036/entity-framework-v4-1-like/8000303#8000303。我不知道这个函数在SQL Server中的性能与普通的'LIKE'相比(但它可能不会更好)。 – Slauma