2016-07-25 7 views
0

에서 열거 형을 참조하십시오. 열거 형은 EDMX 파일에 정의됩니다.어떻게 다음 (간체) 엔티티 SQL 쿼리가 엔티티 SQL

그대로,이 쿼리는 작동하지 않으므로 CustomerStatus가 Int32와 호환되지 않습니다 (기본 형식 입니다). 그러나 열거 이름 앞에 어떤 네임 스페이스가 있더라도 IN {} 절에 대한 CustomerStatus 값 목록을 정의하는 방법을 찾을 수 없습니다. 예를 들어,

는 는
SELECT VALUE a 
FROM Customers AS a 
WHERE a.Status NOT IN { MyModelEntities.CustomerStatus.Reject, MyModelEntities.CustomerStatus.Accept } 

는 컨테이너에 MyModelEntities.CustomerStatus을 찾을 수 없습니다 말, 또는 그러한 예외를 발생, 작동하지 않았다.

은 결국 나는

SELECT VALUE a 
FROM Customers AS a 
WHERE CAST(a.Status AS System.Int32) NOT IN { 2, 3 } 

로, int로하는 Status 캐스팅에 등을 의지하지만 난 더 우아한 해결책을 기대했다.

+0

쿼리가 전송되기 전에 enum을 (int)로 캐스트 할 수 없습니까? –

+0

@DanielLorenz 무슨 뜻인가요? 마지막 쿼리에서 볼 수 있듯이 결국 내가 한 일입니다. –

+0

직접 SQL을 작성하거나 DbSet을 사용하고 있습니까? SQL을 직접 작성하는 경우 데이터베이스에 열거 형 개념이 없으므로 int를 사용해야합니다. EF는이를 int로 변환합니다. –

답변

0

Oooh, 당신은 Entity SQL을 직접 작성하고 있습니다. 나는 ... 손으로 Entity SQL을 작성하는 대신 DbSet을 사용하지 않는 이유는 무엇입니까? 항상 할 수 있습니다

var statuses = new [] { Status.A, Status.B }; 
var query = context.SomeTable.Where(a => !statuses.Contains(a.Status)).ToList(); 
+0

그 이유는 질의가 실제적으로'String.Format'으로 동적으로 생성되어 선택된 엔티티 (실제로 질의가'a '의 탐색 속성을 선택 함)를 대체하고'WHERE' 절을 수정하기 때문입니다. –

+0

흠, 실제로 여기 동적 SQL을 사용하는 것을 보지 못했습니다. ctx.Customers.Where (a => status ..)를 선택할 수 없습니다 (a => a.Value) .ToList()? –

+0

실제 쿼리가 더 복잡합니다. 나는 'a.ValueA' 또는'a.ValueB'를 선택할 수 있으며, 상태 목록에 추가로'WHERE' 절은 추가적인 동적 조건을 가지고 있습니다. 'String.Format ("SELECT VALUE a. {0} 고객이 인 경우 CAST (a.Status AS System.Int32)가 {{2, 3}}이 (가) AND. {1}이 (가) NULL이 아님" , selectedProperty, filterProperty)' –