4

Win7 アプリで、EF の EntityClient を使用して SqlServerCe 3.5 (IPManager_DBEntities) にアクセスし、「Channels」の EntitySetMapping 名で、「Channel」と呼ばれる ADO.NET データベース テーブルのいくつかのフィールドを更新しようとしています。

VS 2010 IDE を使用すると、コードは正常にコンパイルされ、Intellisense に問題はありません。チャネル データテーブルの形式は、行のさまざまなフィールド (チャネルの「番号」で選択) をコードから渡された情報で更新する必要があるため、下部で参照されますが、簡単にするために表示されていません。過去数日間、Google で検索しても、型キャストのジレンマが解決されませんでした。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 クエリは、シーケンス内に項目が 1 つしかない場合でもIEnumerable<T>、 ではなくからの子孫の型のオブジェクトを返しています。Channel実際のアイテムを取得するには、次を使用しますFirstOrDefault

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

または、、、またはFirstそれらSingleSingleOrDefaultいずれかがより適している場合。

于 2012-09-21T19:41:04.037 に答える
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 に答える
0

あなたの最初のコマンドは、IEnumerable列挙するオブジェクトと同じタイプではない を返していると確信しています。

.First()LINQ ala LINQ Select Firstの最後に追加してみてください

これが必要なのは、元の LINQ ステートメントが aIEnumerable<Channel>と同じではないタイプの を返すため、タイプChannelの不一致が発生するためです。最初の LINQ ステートメントは物のリストを返すものと考えることができますが、そのリストを 1 つの項目に入れようとしています。最後の.First()は、そのリストから最初の要素を取得し、それのみを返すようにコンピューターに指示します。したがって、更新された LINQ ステートメントを使用すると、aChannelに aChannelを格納するようになり、型の不一致がなくなります。

于 2012-09-21T19:42:45.877 に答える