SingleResult <myobject> .ToList或.Count抛出InvalidCastException </myobject>

时间:2011-04-06 19:43:19

标签: c# linq linq-to-sql

我有一个存储过程GetTopRecords()。 sp返回前500个记录。

  1. 我将sp从服务器资源管理器拖到LinqtoSql设计器表面。
  2. 我将返回类型更改为记录
  3. 在代码中我有:

    var x = myDataContext.GetTopRecords();
    var y = x.Count();
    var z = x.ToList();
    
  4. 上面最后两行中的任何一行都会引发InvalidCastException

    x的类型是

    System.Data.Linq.SqlClient.SqlProvider.SingleResult<Record>
    

    为什么我会收到例外?我究竟做错了什么?请帮忙。

5 个答案:

答案 0 :(得分:2)

x不是列表,它是单个元素。作为单个元素,您无法将其转换为多个元素的列表或计算它有多少元素。

正如您所说“我将返回类型更改为记录”。你为什么这样做?

答案 1 :(得分:0)

由于这是L2S(Linq To SQL),我假设它正在使用延迟加载,这意味着只有在调用立即执行的CountToList时,才会执行查询

也就是说,问题应该与您从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)

我不确定我是如何解决这个问题的。但现在已经修好了。如果有人遇到此问题,请在此处添加备注,我将查找我的代码并发布正确的答案。虽然我感谢上面的回复者,但不幸的是,上述答案都没有帮助。