LinqToSql查询中的“指定的强制转换无效”

时间:2012-07-13 08:47:31

标签: c# linq-to-sql casting enums .net

指定演员无效

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();

为什么?

StackTrace的一部分:

  

at System.Linq.Enumerable.d__b1 1.MoveNext() at System.Linq.Enumerable.<OfTypeIterator>d__aa 1.MoveNext()      at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source)      at System.Data.Linq.SqlClient.QueryConverter.VisitContains(表达式序列,表达式值)      在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)      at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)      在System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点)      在System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression谓词)      在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)      at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)      在System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression谓词)      在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)      at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)      在System.Data.Linq.SqlClient.QueryConverter.VisitGroupBy(表达式序列,LambdaExpression keyLambda,LambdaExpression elemLambda,LambdaExpression resultSelector)      在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)      at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)      在System.Data.Linq.SqlClient.QueryConverter.VisitJoin(Expression outerSequence,Expression innerSequence,LambdaExpression outerKeySelector,LambdaExpression innerKeySelector,LambdaExpression resultSelector)      在System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)      at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)      在System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(表达式节点)      at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query,SqlNodeAnnotations annotations)      at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)      在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来源)

3 个答案:

答案 0 :(得分:2)

如果没有数据丢失,您无法将enum投射到byte,因此投射会失败(enum是一个int

但如果您只想使用0-255范围内的值,则可以定义enum以使用byte

public enum Values : byte { val1, val2};

见这里:http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

答案 1 :(得分:0)

如果枚举的基类型是int(默认值),则可以将枚举转换为int。

如果枚举的基类型是一个字节,则可以将枚举转换为一个字节。

答案 2 :(得分:0)

您的枚举值中很可能包含一个不适合byte的值。

假设此代码:

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

如果符合以下条件,它将起作用:

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

如果符合以下条件,则无效:

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