C# 无法强制转换类型为';System.Data.Objects.ObjectQuery`1[Manager.Data.Channel]';输入';Manager.Data.Channel';

C# 无法强制转换类型为';System.Data.Objects.ObjectQuery`1[Manager.Data.Channel]';输入';Manager.Data.Channel';,c#,linq,exception,ado.net,C#,Linq,Exception,Ado.net,在Win7应用程序中,我尝试使用EntitySetMapping名称“Channels”更新ADO.NET数据库表中名为“Channel”的几个字段,使用EF中的EntityClient访问SqlServerCe 3.5(IPManager_DBEntities) 使用VS 2010 IDE,代码编译良好,Intellisense没有任何问题。通道数据表的格式在底部引用,因为一行中的各个字段(由通道“编号”选择)需要使用从代码传递给它的信息进行更新,为了简单起见,没有显示这些信息。在过去的几天里

在Win7应用程序中,我尝试使用EntitySetMapping名称“Channels”更新ADO.NET数据库表中名为“Channel”的几个字段,使用EF中的EntityClient访问SqlServerCe 3.5(IPManager_DBEntities)

使用VS 2010 IDE,代码编译良好,Intellisense没有任何问题。通道数据表的格式在底部引用,因为一行中的各个字段(由通道“编号”选择)需要使用从代码传递给它的信息进行更新,为了简单起见,没有显示这些信息。在过去的几天里,我在谷歌上搜索到的任何东西都没有解决我的类型选择难题。使用LINQ,我得到以下运行时异常:

无法将“System.Data.Objects.ObjectQuery`1[Manager.Data.Channel]”类型的对象强制转换为“Manager.Data.Channel”类型


我希望有人能找到一个解决方案来帮助我度过这个困境。

LINQ查询返回的是一个从
IEnumerable
派生的类型的对象,而不是
Channel
,即使序列中只有一个项。要获取实际项目,请使用:


或者,或者如果其中任何一个更合适。

我很确定您的第一个命令返回的是一个
IEnumerable
,它与它枚举的对象的类型不同

尝试将
.First()
添加到LINQ ala的末尾


这是必需的,因为原始LINQ语句返回的
IEnumerable
类型与
Channel
不同,因此您得到的类型不匹配。您可以将初始LINQ语句视为返回一个事物列表,但您正试图将该列表放入单个项中。最后的
.First()
告诉计算机从列表中抓取第一个元素并只返回该元素。因此,使用更新的LINQ语句,您现在将
通道存储在
通道中,因此不再存在类型不匹配。

在我的情况下,我可以使用AddRange方法修复它

 Public Function GetMessages(ByVal Issue As Issue) As List(Of Message)
        Dim Res As New List(Of Message)
        If Issue IsNot Nothing Then
            Dim db As New ProjectManagerEntities
            Res.AddRange(From item As Message In db.Messages
                                       Where item.IssueSet_Id = Issue.Id _
                                       Select item)

        End If

        Return Res
    End Function

FirstOrDefault()或SingleOrDefault()都工作得很好。谢谢你的快速回复。您能否简单地解释一下使用这两个扩展如何解决类型不匹配问题?当然可以。因此,在调用
FirstOrDefault
之前,您拥有的对象是
IEnumerable
(或类似的对象),因为所有LINQ查询都返回从
IEnumerable
派生的集合。当您调用,
FirstOrDefault
时,它将返回集合中的第一个元素。因此,您可以无误地投下它。感谢您的快速响应。.First()扩展与@FishBasketGordo建议尝试FirstOrDefault()或SingleOrDefault()一样有效,这也很有效。你们救了我一天!!
Channel thisChannelRow = (Channel)(from CE
                                   in context.Channels
                                   where CE. Number == int.Parse(IDLine[2])
                                   select CE).FirstOrDefault();
 Public Function GetMessages(ByVal Issue As Issue) As List(Of Message)
        Dim Res As New List(Of Message)
        If Issue IsNot Nothing Then
            Dim db As New ProjectManagerEntities
            Res.AddRange(From item As Message In db.Messages
                                       Where item.IssueSet_Id = Issue.Id _
                                       Select item)

        End If

        Return Res
    End Function