SingleResult<myObject> .ToList or .Count throws an Inv

本文关键字:Count throws an or Inv gt lt myObject SingleResult ToList | 更新日期: 2023-09-27 17:48:56

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

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

    var x = myDataContext.GetTopRecords();
    var y = x.Count();
    var z = x.ToList();
    

上面最后两行中的任何一行都会抛出一个InvalidCastException

x的类型为

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

为什么我得到一个异常?我做错了什么?请帮助。

SingleResult<myObject> .ToList or .Count throws an Inv

x不是一个列表,它是单个元素。作为单个元素,您不能将其转换为包含多个元素的列表,也不能计算它有多少个元素。

正如你所说的"我将返回类型更改为Record"。你为什么要这么做?

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

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

我不知道如何解决这个问题。但现在已经解决了。如果有人遇到这个问题,请在这里添加一个说明,我会查找我的代码,并张贴适当的答案。虽然我感谢上面的回复者,但不幸的是,上面的答案都没有帮助。