2012-07-13 3 views
1

지정된 캐스트가 유효하지 않습니다..LinqToSql 쿼리에서 "지정한 캐스트가 유효하지 않습니다."

OrderItemState는 enum입니다.

IEnumerable<OrderItemState> states = ...; 
IEnumerable<byte> stateIds = Enumerable.Cast<byte>(states); 

List<OrderEntry> entries = 
    (from m in dc.OrderItemMotions 
    where stateIds.Contains(m.OrderItemStateId) 
    select ...).ToList(); 

왜? 스택 트레이스의

부품 :

System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Collections.Generic.List 1..ctor에서 System.Linq.Enumerable.d__b1 1.MoveNext() at System.Linq.Enumerable.<OfTypeIterator>d__aa 1.MoveNext()에서

(1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable는 IEnumerable 1 소스)에 System.Data.Linq.SqlClient.QueryConverter.VisitInner (Expression sequence, Expression value) (System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression mc) ) 노드) at System.Data.Linq.SqlClient.Que System.Data.Linq.SqlClient.QueryConverter.VisitWhere (표현식 시퀀스, LambdaExpression 조건 자)의 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression mc) at System.Data Linq.SqlClient.QueryConverter.VisitInner System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression의 MC)에 System.Data.Linq.SqlClient.QueryConverter.VisitWhere (식 서열 LambdaExpression 술어) 에서 (식 노드)에서 System.Data.Linq.SqlClient.QueryConverter.VisitInner (식 노드) System.Data.Linq.SqlClient.QueryConverter.VisitGroupBy (식 시퀀스, LambdaExpression keyLambda, LambdaExpression elemLambda, LambdaExpression resultSelector) at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression mc) (System.Data.Linq.SqlClient.QueryConverter.VisitInfo) 시스템에서, 식 innerSequence, System.Data.Linq.SqlClient.QueryConverter.VisitInner에서 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression의 MC)에 LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector) (식 노드) .Data.Linq.SqlClient.QueryConverter.ConvertOuter (식 노드) 에서 System.Data.Linq.SqlClient.SqlProvider.BuildQuery (식 쿼리, SqlNodeAnnotations 주석) at System.Data.Linq.SqlClie nt.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (식 쿼리) System.Data.Linq.DataQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List 1..ctor에서 (1 소스는 IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable)

+1

다음의 경우

enum MyEnum:byte { first = 120, second }; 

그것은 작동하지 않습니다 경우

IEnumerable<MyEnum> arr = new MyEnum[] { MyEnum.first, MyEnum.second }; var bytes = Enumerable.Cast<byte>(arr); foreach (var b in bytes) { Console.WriteLine(b); } 

그것은 작동합니다

이 코드를 가정 사실'바이트'? 그렇지 않다면 'double cast'(예 :'(byte) (int) enumvalue')를해야합니다. – leppie

답변

2

당신은 (enum은 후드 아래에 int입니다) 데이터 손실없이 enumbyte으로 캐스팅 할 수 없습니다.

하지만 사용하기 enum을 정의 할 수 byte 후드 아래 만 사용하여 0 ~ 255 범위의 값을 원하는 경우 :

public enum Values : byte { val1, val2}; 

여기를 참조하십시오 : http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

+0

예, 열거 형 int입니다. 이제 바이트이고 잘 작동합니다. 감사. – FireShock

0

베이스 타입이면 enum이 int (기본값)이면 enum을 int로 캐스트 할 수 있습니다.

enum의 기본 형식이 바이트 인 경우 열거 형을 바이트로 캐스팅 할 수 있습니다. 캐스트가 실패합니다 있도록

0

대부분의 경우 하나를 열거 형 값 중 byte에 맞지 않는 값이 있습니다. 당신은 확실히 열거의 지원 유형에

enum MyEnum:long { first = 1204, second }; 
관련 문제