对于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方法?任何帮助将不胜感激!
答案 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)