2011-11-18 60 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