我有一个存储过程GetTopRecords()。sp返回前500条记录。
- 我把sp从服务器资源管理器拖到LinqtoSql设计器界面。
- 我将返回类型更改为Record
在代码中我有:
var x = myDataContext.GetTopRecords(); var y = x.Count(); var z = x.ToList();
上面最后两行中的任何一行都会抛出一个InvalidCastException
x
的类型为
System.Data.Linq.SqlClient.SqlProvider.SingleResult<Record>
为什么我得到一个异常?我做错了什么?请帮助。
x不是一个列表,它是单个元素。作为单个元素,您不能将其转换为包含多个元素的列表,也不能计算它有多少个元素。
正如你所说的"我将返回类型更改为Record"。你为什么要这么做?
由于这是L2S (Linq To SQL),我假设它使用延迟加载,这意味着只有在调用Count
或ToList
时,才会立即执行查询。
也就是说,问题应该与您从GetTopRecords
方法返回的内容有关,该方法与Record
类型不兼容。
您应该使用L2S设计器来检查该方法的结果是否正确地映射到Record
数据类型。这意味着Record
应该是L2S映射表,并且GetTopRecords应该从表返回数据。
那么,你能给出详细的GetTopRecords()。它返回什么?你需要顶级记录的计数吗?
var x = i.ToList();var y = x.Count();那么它将被允许,但是当您使用tolist()时,tolist会对查询进行迭代,并创建一个使用查询的所有结果初始化的List<>实例。这与count()相同,因为count也需要所有记录来执行计数。
我认为自从linq to sql类生成以来,数据库模式已经发生了变化。因此,在数据库表和表示它的linq to Sql对象之间存在不匹配。因此,调用失败,因为.NET不能成功地从db创建的对象转换为linq to sql对象
我不知道如何解决这个问题。但现在已经解决了。如果有人遇到这个问题,请在这里添加一个说明,我会查找我的代码,并张贴适当的答案。虽然我感谢上面的回复者,但不幸的是,上面的答案都没有帮助。