2012-07-13 39 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.d__b1 1.MoveNext() at System.Linq.Enumerable.<OfTypeIterator>d__aa 1.MoveNext() 在System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable的1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1源) 在System.Data.Linq.SqlClient.QueryConverter.VisitContains(Expression sequence,Expression value) at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression節點) at System.Data.Linq.SqlClient.Que ryConverter.Visit(表達式節點) at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence,LambdaExpression predicate) at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) at System.Data。 Linq.SqlClient.QueryConverter.VisitInner處System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表達式序列,LambdaExpression謂詞) (表達式節點) 在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression MC) System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) at System.Data.Linq.SqlClient.QueryConverter.VisitGroupBy(Expression sequence,LambdaExpression keyLambda,LambdaExpression elemLambda,LambdaExpression resultSelector) at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) at System.Data.Linq.SqlClient.QueryConverter.VisitJoin(Expression outerSequence ,表達innerSequence,LambdaExpression outerKeySelector,LambdaExpression innerKeySelector,LambdaExpression resultSelector) 在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression MC) 在System.Data.Linq.SqlClient.QueryConverter.VisitInner(表達在系統節點) .Data.Linq.SqlClient.QueryConverter.ConvertOuter(表達式節點) at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query,SqlNodeAnnotations annotations) 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(IEnumerable的1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1源)

+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); } 

其能否正常工作事實上是一個'字節'?如果沒有,你需要做'雙重轉換',例如'(byte)(int)enumvalue'。 – leppie 2012-07-13 08:54:30

回答

2

你不能施放的enumbyte而不會丟失數據,因此投將失敗(enum是引擎蓋下的int)。

但是你可以定義一個enum使用byte下,引擎罩,如果你只使用要在255範圍內的值:

public enum Values : byte { val1, val2}; 

在這裏看到:http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

+0

是的,枚舉是int。現在它是字節並且工作正常。謝謝。 – FireShock 2012-07-13 09:17:37

0

如果基型的枚舉是一個int(默認值),您可以將枚舉強制轉換爲int。

如果枚舉的基類型是一個字節,則可以將枚舉強制轉換爲一個字節。

0

最有可能的一個的枚舉值包含一個不適合byte的值。

假定這段代碼:

enum MyEnum:long { first = 1204, second };