2011-11-18 4 views
2

을 탈출 내가 가진 그것은 SQL 서버방지 EF 와일드 카드 문자

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%에 다음과 같은 성명 결과이

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

같은은 SQL 서버 (리터럴 %xxx%yyy을 찾아 원인 그것은 도망 간다.) 나는 xxx123yyy, xxxABCyyy, xxxANYTHINGyyy, xxxyyy 등의 문자열과 일치시키고 싶다. prefix %suffix % 괜찮지 만 필요할 경우 수동으로 할 수 있습니다.

위의 예제에서 조건을 하나만 작성하고 단순화했으나 이러한 키워드가 많은 조건자를 작성하는 동적 논리가 있으며 키워드 내에 와일드 카드를 포함 할 수 있습니다. EF가 검색 키워드에서 %를 벗어나지 않도록 지시하는 방법이 있습니까?

답변

1

불가능합니다. Contains("xxx")은 SQL에서 사용자가 LIKE '%xxx%'을 원한다는 것을 의미합니다. Linq-to-entities와 매핑 된 방법 중 어느 것도 전체 와일드 카드 검색을 제공하지 않습니다. = 와일드 카드 문자는 항상 이스케이프됩니다. 와일드 카드 검색을 사용하려면 Entity SQL을 사용해야합니다.

+0

감사합니다. 나는 연결된 질문을 발견했지만 뭔가 새로운 것이 있었으면 좋겠다. 매개 변수와 함께 손으로 만들어진 SQL과 함께 ExecuteStoreQuery를 사용하고 있습니다. 이전에 정적 바인딩과 함께 PredicateBuilder를 사용했지만 모든 것이 문자열이 아니 었습니다. ( –

+1

@amit_g : SQL Server로 작업하는 경우 LINQ 쿼리를 사용할 수있는 해결 방법 ('SqlFunctions.PatIndex')이 있습니다. http : // /stackoverflow.com/questions/6202036/entity-framework-v4-1-like/8000303#8000303. 일반적인 'LIKE'에 비해 SQL Server에서이 기능의 성능에 대해서는 잘 모르겠지만). – Slauma