【问题标题】:"Specified cast is not valid" in LinqToSql queryLinqToSql 查询中的“指定转换无效”
【发布时间】:2012-07-13 08:47:31
【问题描述】:

指定的演员表无效

OrderItemState 是 枚举

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 的一部分:

在 System.Linq.Enumerable.d__b11.MoveNext() at System.Linq.Enumerable.<OfTypeIterator>d__aa1.MoveNext() 在 System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源) 在 System.Data.Linq.SqlClient.QueryConverter.VisitContains(表达式序列,表达式值) 在 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 在 System.Data.Linq.SqlClient.QueryConverter.VisitInner(表达式节点) 在 System.Data.Linq.SqlClient.QueryConverter.Visit(表达式节点) 在 System.Data.Linq.SqlClient.QueryConverter.VisitWhere(表达式序列,LambdaExpression 谓词) 在 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 在 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(表达式节点) 在 System.Data.Linq.SqlClient.QueryConverter.VisitGroupBy(表达式序列,LambdaExpression keyLambda,LambdaExpression elemLambda,LambdaExpression resultSelector) 在 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 在 System.Data.Linq.SqlClient.QueryConverter.VisitInner(表达式节点) 在 System.Data.Linq.SqlClient.QueryConverter.VisitJoin(表达式 externalSequence,表达式 innerSequence,LambdaExpression outerKeySelector,LambdaExpression innerKeySelector,LambdaExpression resultSelector) 在 System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 在 System.Data.Linq.SqlClient.QueryConverter.VisitInner(表达式节点) 在 System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(表达式节点) 在 System.Data.Linq.SqlClient.SqlProvider.BuildQuery(表达式查询,SqlNodeAnnotations 注释) 在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式查询) 在 System.Data.Linq.DataQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源)

【问题讨论】:

  • 您确定枚举的支持类型实际上是byte?如果没有,您将需要进行“双重演员”,例如(byte)(int) enumvalue

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


【解决方案1】:

您无法将enum 转换为byte 而不会丢失数据,因此转换将失败(enum 本质上是int)。

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

public enum Values : byte { val1, val2};

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

【讨论】:

    【解决方案2】:

    如果枚举的基本类型是 int(这是默认值),您可以将枚举强制转换为 int。

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

    【讨论】:

      【解决方案3】:

      您的某个枚举值很可能包含一个不适合 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 };
      

      【讨论】:

        猜你喜欢
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多