使用Linq to SQL时为什么会出现“Invalid Cast”?

时间:2009-01-12 01:39:27

标签: linq-to-sql

对于Linq to SQL,我有点新手,但我希望你能提供帮助。我用扩展方法编写了以下Linq to SQL语句:

Cedb.ClassEvents.Where(c => c.ClassID == 1).Select(c => c).Single()

如果Cedb是Datacontext,则ClassEvents是一个表(用于在工厂中保存的类和事件),ClassID是唯一的整数键。

此查询在LinqPad(没有Cedb)中运行良好。当它返回时,它表示返回类型是“ClassEvent”。在Visual Studio的Intellisense中,它告诉我此查询的返回类型是ClassEvent(在我的数据模型中创建)。但是,当我尝试将结果放在变量中时:

var classEvent = Cedc.ClassEvents.Where(c.ClassID == 1).Select(c => c).Single();

然后我收到一个错误:InvalidCastException:指定的强制转换无效。如果我使用“ClassEvent”类代替var,也会发生同样的事情。我是新手,但这个看起来像是一个真正的扣篮,而不是一个错误。是否有一些我不知道导致错误的Single方法?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

Slace - 以及任何其他感兴趣的人士。 “无效的转换异常”错误的原因是基础数据模型的更改。 smallint字段已更改为bit。因此,当系统尝试将查询结果映射到“ClassEvent”数据结构时,模型(尚未更新)与数据表之间的冲突就会出现。

尽管如此,我确实很感激答案!

答案 1 :(得分:1)

你不需要同时选择Select和Single,事实上,你甚至不需要Where,你可以逃脱(见http://msdn.microsoft.com/en-us/library/bb535118.aspx):

var classEvent = Cedc.ClassEvents.Single(c => c.ClassID == 1);

我还建议不要使用Single,除非您100%确定Func<T, bool>将始终返回一个值,就好像它没有返回值一样,您将抛出异常。更好的是使用SingleOrDefault并在与对象(http://msdn.microsoft.com/en-us/library/bb549274.aspx

交互之前进行空检查