C# 无法强制转换类型为';System.Data.Objects.ObjectQuery`1[Manager.Data.Channel]';输入';Manager.Data.Channel';
在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”类型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没有任何问题。通道数据表的格式在底部引用,因为一行中的各个字段(由通道“编号”选择)需要使用从代码传递给它的信息进行更新,为了简单起见,没有显示这些信息。在过去的几天里
我希望有人能找到一个解决方案来帮助我度过这个困境。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