4

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

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

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

    // Update channel status with information parsed from the data packet.
    using (IPManager_DBEntities context = new IPManager_DBEntities())
    {
        Channel thisChannelRow = (Channel)(from CE
                                             in context.Channels
                                          where CE. Number == int.Parse(IDLine[2])
                                         select CE);

        // Throwing exception after setting up this query:
        //   "Unable to cast object of type 'System.Data.Objects.ObjectQuery`1
        //   [Manager.Data.Channel]' to type 'Manager.Data.Channel'"
        //  During debug sessions, "thisChannelRow" is null as a result.

        MessageBox.Show("thisChannelRow. Channel = " + thisChannelRow.Number );

            ThisChannel.StatusID = int.Parse(IDLine[5]);
            ThisChannel.Cycle = int.Parse(IDLine[4]);
            ThisChannel.Modified = DateTime.Now;
            context.SaveChanges();
     }

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

4

3 回答 3

4

LINQ 查询返回类型为 的后代的对象IEnumerable<T>,而不是Channel,即使序列中只有一个项目。要获取实际项目,请使用FirstOrDefault

Channel thisChannelRow = (Channel)(from CE
                                   in context.Channels
                                   where CE. Number == int.Parse(IDLine[2])
                                   select CE).FirstOrDefault();

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

于 2012-09-21T19:41:04.037 回答
0

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

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

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

于 2012-09-21T19:42:45.877 回答
0

在我的情况下,我可以使用 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
于 2012-10-26T15:30:04.753 回答