2016-09-21 11 views
1

그림 1에 표시된 것처럼 here이라는 차단 예제를 사용하여 EF 6에서 작동하지만 RewriteFullTextQuery과 같은 문제가 발생하면 차단이 작동하는 것 같습니다. cmd.Parameters.Count은 항상 0이므로 RewriteFullTextQuery 메서드의 for 루프에서 실제로 논리를 실행하지 않습니다. 또한 cmd.CommandText 속성은 가로 채기가 올바르게 작동하고 있다는 또 다른 증거로 받아들이는 올바른 SQL 쿼리를 표시하는 것으로 보입니다.Intercept가 Entity Framework 6에서 예상대로 작동하지 않습니다.

도 1 RewriteFullTextQuery 코드 발췌

public static void RewriteFullTextQuery(DbCommand cmd) 
    { 
     string text = cmd.CommandText; 
     for (int i = 0; i < cmd.Parameters.Count; i++) 
     { 
      DbParameter parameter = cmd.Parameters[i]; 
      if (parameter.DbType.In(DbType.String, DbType.AnsiString, DbType.StringFixedLength, DbType.AnsiStringFixedLength)) 
      { 

RewriteFullTextQuery 기능은 모든 문제를 일으키는 명령 인수를 제공도 2에 도시 ReaderExecuting 함수가 호출되고있다.

그림 2 : ReaderExecuting 기능

내 코드의 예와 완전히 동일하지 않습니다 비록
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
     RewriteFullTextQuery(command); 
    } 

, 차단은 채울 것 그것이 그것이 나에게 어떤 조건을 궁금해하고있다 그래서 작동하는 것 같군 명령을 사용하여 Parameters.Count이 0 이상입니까?

답변

1

그것 때문에 엔티티 프레임 워크가 SQL을 생성하는 방식이라고 밝혀 것이다. LINQ 문에 검색 값으로 문자열 리터럴을 전달하면 매개 변수를 사용하는 SQL이 생성되지 않습니다. 그러나 검색 값을 변수로 전달하면 매개 변수를 사용하는 SQL이 생성됩니다. 해결책 (동적 쿼리의 경우) 및 자세한 내용은 blog에서 확인할 수 있습니다.

1

매개 변수를 쿼리에 변수로 전달한 경우에만 작동합니다. 리터럴을 사용하면 EF는 매개 변수를 사용하지 않습니다. 내 말은
,이 모든 매개 변수

context.Notes.Where(_ => _.NoteText == "CompareValue").Count(); 

를 생성하지 않습니다이

string compareValue = "CompareValue"; 
context.Notes.Where(_ => _.NoteText == compareValue).Count(); 
+1

나는 어제 대답으로 그 블로그를 발견하고 내가 찾은 바로 그 대답을 바꾼 것을 알기 바로 전에 나의 대답을 게시했습니다. 내 대답을 받아 들일 수있는 블로그의 해결책이 있었기 때문에 대답을 받아들이고 싶습니다. 그러나 도움을 주신 답을 상향 표시합니다. –