Linq结果转换为IEnumerable时出现无效转换错误

3

针对Linq用户的问题:每当我尝试从Linq查询中获取一个IEnumerable并在此之后从revs中进行操作时,出现“InvalidCastexception: Specified cast is not valid”错误。数据库已填充,应该返回值。

具体而言,错误发生在这一行:List<PDP> rev = revs.ToList<PDP>();

有任何想法是怎么回事吗?

short ret;
using (DataContext db = new DataContext())
{
    var play = from p in db.PDP
        where p.ID == id
        select p;
    var revs = play.OrderByDescending(p => p.revision);
    List<PDP> rev = revs.ToList();
    var revNum = revs.ToList().Count() > 0 ? rev.First().revision : 0;
    ret = (short)revNum;
}

编辑
我已经澄清了代码的某些部分。

编辑2
rev是一个调试变量,用于缩小错误范围。

原始代码如下:

short ret;
using (GasForecastDataContext db = new GasForecastDataContext())
{
    var play = from p in db.PDP
        where p.Play_ID == play_id
        select p;
    var revs = play.OrderByDescending(p => p.revision);
    var revNum = revs.Count > 0 ? rev.First().revision : 0;
    ret = (short)revNum;
}

1
db.PDP和List<PDP>的数据类型是否正确? - MattS423
我没有看到你在哪里调用 ToEnumerable。你在哪里得到了异常? - Andrew
1
将其更改为 var rev = revs.ToList(); 有帮助吗? - asawyer
1
你在 revs 上调用了两次 ToList()。相反,你应该在赋值 revs 时调用 ToList(),使其成为 List<T> 类型而不是 IEnumerable<T> 类型(如果这是你想要的)。此外,在 List<T> 上不需要调用 Count()。只需使用更高效的 Count 属性即可。 - Martin Liversage
@Swimming 你为什么需要这个列表呢?我还是不太明白。 - Brandon Moretz
显示剩余7条评论
4个回答

1
你声明“rev”列表变量的具体原因是什么?IEnumerable接口(“revs”)上可用“Count()”和“First()”。
short ret;

using (DataContext db = new DataContext())
{
    var play = from p in db.PDP
        where p.ID == id
        select p;

    var revs = play.OrderByDescending(p => p.revision);

    ret = (short) revs.Count() > 0 ? revs.First().revision : 0;
}

你那里的代码就是我最初开始的代码。我添加了rev来尝试追踪错误所在。由于某种原因,我无法将IQueryable的结果转换为IEnumerable - dciliske

1

看起来 db.PDP 中的元素类型与 PDP 不同,或者如果它是 PDP,那么它可能在另一个命名空间中。


0

试试这个:

List<PDP> rev = revs.ToList<PDP>();

我刚刚为泛型增加了类型。


1
那不会有任何区别;类型推断已经在这方面做了。 (否则代码无法编译) - SLaks

0

它仍然是IQueryable吗?

rev可能可以转换为IEnumberable,但revs可能仍然是IQueryable。

您可以尝试在revs上调用ToList()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接