我有一个存储过程GetTopRecords()。 sp返回前500个记录。
在代码中我有:
var x = myDataContext.GetTopRecords();
var y = x.Count();
var z = x.ToList();
上面最后两行中的任何一行都会引发InvalidCastException
x
的类型是
System.Data.Linq.SqlClient.SqlProvider.SingleResult<Record>
为什么我会收到例外?我究竟做错了什么?请帮忙。
答案 0 :(得分:2)
x不是列表,它是单个元素。作为单个元素,您无法将其转换为多个元素的列表或计算它有多少元素。
正如您所说“我将返回类型更改为记录”。你为什么这样做?
答案 1 :(得分:0)
由于这是L2S(Linq To SQL),我假设它正在使用延迟加载,这意味着只有在调用立即执行的Count
或ToList
时,才会执行查询
也就是说,问题应该与您从GetTopRecords
方法返回的内容有关,该方法与Record
类型不兼容。
您应该使用L2S设计器检查该方法的结果是否正确映射到Record
数据类型。意味着Record
应该是L2S映射表,而GetTopRecords应该从那个表返回数据。
答案 2 :(得分:0)
那么,你能否详细说明GetTopRecords()。它返回什么?你需要计算最佳记录吗?
var x = i.ToList(); var y = x.Count(); 然后它将允许,但是当你使用tolist()ToList迭代查询并创建List&lt;&gt;的实例时使用查询的所有结果初始化。 对于count()来说是相同的,因为becuse count也需要所有记录来执行计数。 tolist的目的是用结果预先填充数据。
答案 3 :(得分:0)
我认为自从生成了linq to sql类以来,数据库模式已经发生了变化。因此,数据库表和表示它的Linq到Sql对象之间存在不匹配。因此,调用失败,因为.NET无法从db创建的对象成功转换为linq到sql对象
答案 4 :(得分:-2)
我不确定我是如何解决这个问题的。但现在已经修好了。如果有人遇到此问题,请在此处添加备注,我将查找我的代码并发布正确的答案。虽然我感谢上面的回复者,但不幸的是,上述答案都没有帮助。