EF는

2011-10-31 2 views
2

이 코드를 원하는 SQL을 생성합니다 :EF는

string name ="M"; 
Expression<Func<Organization, bool>> getExpression1 = r => r.Name.Contains(name); 
Expression<Func<Organization, bool>> getExpression2 = r => r.Name.Contains("M"); 

GetOrgListBy(getExpression); 
GetOrgListBy(getExpression2); 

public IEnumerable<Organization> GetOrgListBy(Expression<Func<Organization, bool>> filter) 
{ 
    return DataContext.Parties.OfType<Organization>().Where(filter).ToList(); 
} 

질문 : 내가 도착 저장소 기능 에 간단한 표현을 전달하고있다 List<Organization>에 일치하는 이름이 전달됩니다. getExpression1 (문자열 변수 사용)에 대한 sql 추적을 보면 표현식은 % 연산자가 생략 된 [Name] like plinq_variable SQL 문 을 생성합니다. 내 의도는 [Name] like '%' + plinq_variable + '%' SQL 문 I getExpression2을 사용하여 (문자열을 하드 코딩) 그러나

를 생성하는 것입니다, 표현이 성공적으로 는 [Name] like N'%M%' SQL 문을 생성합니다.

getExpression1% 연산자를 생성하지 않는 이유는 무엇입니까? getExpression2처럼 SQL에서 % 연산자를 생성하도록하려면 어떻게해야합니까?

답변

0

첫 번째 표현식은 매개 변수화 된 SQL 쿼리로 변환됩니다. WHERE 절에 변수 ...

[Name] like plinq_variable 

는 ... 쿼리가 실행되는 값

@plinq_variable=N'%M%' 

로 설정됩니다. 두 번째 표현식 리터럴 하드 코딩 된 문자열을 가진 SQL 질의로 변환 :

[Name] like N'%M%' 

그런 다음이 쿼리를 직접 실행됩니다.

식과 쿼리의 결과는 동일합니다.

+0

내 실수는 전에 .ToList() 메서드를 확인했지만 표현식이 % 연산자를 실제로 추가한다는 것입니다. ToList()가 실행되면 SQL을 볼 수 없습니다. 더 정확한 그림을 얻기 위해 문자열에 객체 쿼리 추적을 사용하는 대신 SQL Server에서 추적을 확인해야합니다. – user1022777

관련 문제