2009-01-12 123 views
5

当谈到Linq to SQL时,我有点新手,但我希望你能帮上忙。我已经写了下面的LINQ to SQL语句扩展方法:当我使用Linq to SQL时,为什么会出现“Invalid Cast”?

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

凡商务及经济发展是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方法的问题,我不知道是导致错误?任何帮助,将不胜感激!

回答

5

Slace - 以及任何其他感兴趣的方。 “无效的转换异常”错误的原因是底层数据模型的变化。一个小小的领域已经改变了一点。因此,当系统试图将查询结果映射到“ClassEvent”数据结构时,模型(尚未更新)和数据表之间出现冲突。

尽管如此,我很欣赏答案!

1

你不需要做既选择和一个单一的,事实上,你甚至不需要在那里,你可以逃脱(见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

+0

谢谢!我开始输入“如果有人知道更简单的方法......”,因为我记得有一篇“10个神话”文章解释了这种情况。但是,我想了解所有事情都做了什么,而不仅仅是寻找捷径。幸运的是,你们都做到了。再次感谢。 – 2009-01-12 02:38:56

+0

链接到[10 LINQ神话](http://www.albahari.com/nutshell/10linqmyths.aspx) – Justin 2012-07-01 22:00:29

相关问题