2012-08-06 2 views
2

요약하면 데이터베이스 뷰를 사용하지 않고 엔티티 모델에서 리터럴 SQL 하위 쿼리를 사용할 수 있습니까?* sql * 하위 쿼리가 포함 된 Entity Framework 쿼리

컨텍스트 : 나는 C# 개체를 생성하는 ADO.NET 쿼리를 많이 가지고 있습니다. 이러한 개체는 쿼리 모양에 직접 해당합니다. 즉 ObjectContext.Translate을 사용하여 SqlDataReader에서 추출 할 수 있습니다. 많은 이들 쿼리가 많이 있습니다. 그 중 상당수는 복잡하며 엔티티 프레임 워크가 지원하지 않는 기능 (루프, CTE, hierarchyids 등)을 사용합니다. 이러한 (레거시) 쿼리를 LINQ로 변환하는 것은 실현 가능하지 않습니다.

그러나 이러한 결과를 래핑하고 C# 측에서 사용자 지정 필터링을 추가하는 것이 좋습니다. 즉, 정렬, 필터링, 페이징 등의 작업을 수행 할 수 있습니다. 각 및 모든 쿼리를보기로 변환 할 수 있습니다 (또는 스토어드 프로 시저)를 작성하고 맵핑 할 수는 있지만, 이는 번거롭고 유지 보수의 악몽입니다. ​​원칙적으로 EF는 해당 경로의 "불투명"SQL 쿼리와 함께 사용할 수 있습니다.

엔티티 모델과 함께 SQL로 작성된 하위 쿼리를 어떻게 든 사용할 수 있습니까? IEnumerable 대신 IQueryable을 반환하는 ObjectContext.Translate이 이상적 일 수 있지만 반드시 필요한 것은 아닙니다. 대다수의 쿼리는 컴파일 타임 상수이므로 사전 처리가 가능합니다.

편집 : 나는/IQueryable 그래서 난 필터를 추가 할 수 있습니다 반환 뭔가를 찾고 클라이언트 측 정렬하지만 그들 (평소처럼)를 DB에서 실행 한거야. Entity Framework 코드 우선을 사용하고 있습니다.

답변

3

EntitySet의 DefiningQuery 속성을 일부 리터럴 SQL로 설정할 수 있습니다. 이것들은 SQL보기와 어느 정도 일치합니다. 그게 당신의 문제를 해결합니까? 당신의 SQL 쿼리가 엔티티 클래스와 같은 구조로 결과를 제공하는 경우

http://msdn.microsoft.com/en-us/library/cc982038.aspx

+0

즉 좋아 보인다! 그러나, 나는 이미 코드 우선을 사용하고 있으며 동일한 어셈블리에서 먼저 코드와 첫 번째 코드를 섞을 수 없다는 것을 언급하는 것을 간과 한 다. 그래서이 솔루션은 안타깝게도 사용하기가 어려워 보입니다. –

+0

답변으로 표시 : 이상적인 것으로는 거리가 멀지만 최상의 솔루션 일 수 있습니다. 팁 고마워! –

1

, 당신은 DbContext.SqlQuery

var customer=context.Database. 
     SqlQuery<Customer>("SELECT ID,NAME from CUSTOMER WHERE TYPE IN 
        (SELECT TYPEID FROM IMPORTANT_TYPE)"); 

context 가정 사용할 수 있습니다 당신의 DBContext 클래스 개체

+1

아니요, 작동하지 않습니다 :'SqlQuery'는'IEnumerable'을 반환합니다; 그래서 필터링을 추가하여 결과를 작성하려고하면 클라이언트 측에서 처리 할 것입니다 (일반적으로 많은 양의 데이터를 검색하여 느려지 게됩니다). –