1

을 생성하지 않습니다. 필자의 연구를 통해 적어도 EF 4.1 이후로 EF 쿼리의 .ToString() 메서드가 SQL이 실행되도록 반환한다는 것을 발견했습니다. 사실,이 작업은 Entity Framework 5 및 6을 사용하여 매우 자주 수행됩니다.Entity Framework 쿼리 ToString은 SQL 쿼리

그러나 때때로이 메서드를 호출하고 쿼리 개체의 런타임 형식을 가져옵니다.

Entity input = ...; 
IQueryable<Entity> query = dbContext.SetOfEntity.Where(e => e.Prop == input.Prop); 

보다 구체적으로는, 내가 VS2013에서 중단 점을 설정하고 쿼리 개체를 가리키면, 그 쿼리를 실행하는 SQL 대신 System.Data.Entity.Infrastructure.DbQuery<Namespace.Entity>를보고 있어요 : 은 여기 내 특정 예이다. 흥미롭게도 DBSet 속성 (dbContext.SetOfEntity) 위로 마우스를 가져 가면 을 수행하고은 관련된 테이블의 기본 선택 SQL을 참조하십시오. SQL을 잃어버린 결과를 필터링 할 때만입니다.

분명히 이것은 매우 간단한 쿼리이므로 SQL을 직접 해결할 수 있지만이 문제는보다 복잡한 쿼리에서 발생하며 서버에 보내지는 SQL을 디버깅 할 수 있으면 좋을 것입니다. 데이터베이스 추적을 실행 중입니다.

일부 배경

백, 나는 EF5와 (이) 일 것 같았다 있으며, toString를 사용하는 동안. EF6으로 전환하기 직전에 쿼리의에 SQL이 표시되었지만 EF6으로 전환 한 후 올바른 동작으로 되돌아갔습니다. 또한 IQueryable 쿼리를 가리키고 IDE의 "결과보기"기능을 사용하려고하면 "어린이를 평가할 수 없습니다"라는 메시지가 나타납니다. 이것은 별개의 문제 일지 모르지만, 일반적인 원인이있는 경우에 대비하여 포함시킬 것이라고 생각합니다.

+1

EF6에서 ['DbContext.Database.Log']에 로그를 추가 할 수 있습니다 (http://msdn.microsoft.com/en-us/library/system.data.entity.database.log%28v = vs.113 % 29.aspx) 올바른 대리인을 할당하십시오. 모든 실행 된 SQL은 삽입, 업데이트 등을 포함하여 기록됩니다. –

+1

나는 과거에도 같은 문제가있었습니다. 필자가 실수로 LINQ-to-objects 쿼리를 처음의 SELECT * 쿼리의 맨 위에서 수행했기 때문에 LINQ-to-objects와 마찬가지로 쿼리의 실제 개체가 다르고 (SQL-free) , 그래서 거기에 없었습니다. 결국 내가 잘못하고있는 것을 발견하고 내 쿼리를 수정했습니다. 문제가되는 쿼리 및/또는 쿼리 클라이언트 측의 일부를 실수로 수행하지 않았는지 확인하기 위해 할당되는 유형을 검토하는 것이 좋습니다. –

+0

@martin_costello 저는이 질문에있는 질문과 거의 동일한 쿼리를보고 있습니다. (이 질문은 'Entity'와'Prop'에 대한 도메인 별 이름을 가지고 있습니다.)이 문제가 있습니다. 'Where'는 IQueryable 함수이고'DbQuery' 타입이므로, Linq-to-objects가 될 수있는 방법이 있는지 확실하지 않습니다. – EnvisionAndDevelop

답변

2

가 다음을 수행 할 수있는 DB에 대해 실행하기 전에 SQL이 필요하지 않은 경우 :이 디버그 출력에 SQL (일부 추가 데이터)를 인쇄 할

dbContext.Database.Log = s => Debug.WriteLine(s); 

. martin_costello 제안대로 ToString()를 통해 SQL을 얻기 위해 시도하기 전에 당신이 DB를 쿼리되지 않습니다, http://msdn.microsoft.com/de-DE/data/dn469464

이 또한 확인 :
은 자세한 내용은 다음 링크를 참조하십시오. 이미 IQueryable<> 일 때을 "일찍"사용했기 때문에 이미 객체가 있기 때문에 DB에서 많은 엔티티로 이동하여 "SQL에서"대신 "코드에서"필터링을 수행했습니다. ..

+0

이것은 실행 된 SQL 검색에 대한 내 관심사를 다루지 만 증상보다는 문제를 수정하는 것이 더 좋을 것입니다. 불행히도 우리는 이미 Database.Log를 특별한 오류 처리 함수로 사용하고 있기 때문에 단순히 추적을 실행하는 것보다 훨씬 쉽습니다. 이 답변을 수락하기 전에 더 많은 답변을 기다리는 동안 잠시 기다려 드리겠습니다. – EnvisionAndDevelop