2017-04-11 8 views
0

このエラーに関するその他のスレッドがあり、エラーの意味を知っています。しかし、私は自分のケースで修正コードがどこにあるのかわかりません。タイプ 'WhereSelectEnumerableIterator'2のオブジェクトをPerson(VB.Net)にキャストすることができません

APIからIEnumerable(Of Person)を返す必要があります。以前私はFor Eachループを使用しましたが、同じ結果を達成するために(あまり)少ないコードを使用して調査していました。私はあまりにも遠くshortcuttedてきたかどうかわからないんだけど、ここで(おそらく1行の涅槃を望んで...)

Public Function [Get]() As IEnumerable(Of Person) 
    Using dt As DataTable = LoadDataTable() 
     Return New List(Of Person)() From { 
      From dr In dt.Rows Select New Person() With { 
       .FirstName = dr.Item("FirstName").ToString(), 
       .Surname = dr.Item("Surname").ToString() 
      } 
     } 
    End Using 
End Function 

エラーは次のとおりです。

タイプ のオブジェクトをキャストすることができません「WhereSelectEnumerableIterator`2 [System.Objectの、MyApp.Models.Person]」 のタイプに「MyApp.Models.Person」

私は別の場所で.ToList()拡張メソッドを置くことで推測が、それを得ることができません右。誰もがこれが一回の操作で可能であるかどうかをアドバイスすることができますか、または選択肢がなく、New Listという変数を宣言している場合は教えてください。

+0

'New List ... From'を返すのではなく、' From ... Select'の周りに括弧を置き、 'ToList'を実行するとどうなりますか?代わりに、新しいリストで 'From'を使うのではなく、' From ... Select'をctorの引数として使うとどうなりますか? VBのように、リストの後に中かっこの中にある1つまたは複数のPersonオブジェクトが予想されていて、その代わりに列挙可能なものが得られているようです。 – Craig

答えて

4

@Craigは答えにFromと入力すると、使用しているタイプ(この場合はPerson)のコンマ区切りのリストで、別のコレクションではありません。

あなたはコンストラクタの内容を使用する必要がコレクションからリストを作成したい場合:

Return New List(Of Person)(
    From dr In dt.Rows Select New Person() With { 
     .FirstName = dr.Item("FirstName").ToString(), 
     .Surname = dr.Item("Surname").ToString() 
    } 
) 

しかし、より良いオプションは、ちょうどあなたのLINQクエリにToListを呼び出すために、次のようになります。

Return (From dr In dt.Rows Select New Person() With { 
    .FirstName = dr.Item("FirstName").ToString(), 
    .Surname = dr.Item("Surname").ToString() 
}).ToList() 

また、それが望ましいと判断された場合は、少し少ないワードである拡張メソッド形式があります。

Return dt.Rows.Select(Function(dr) New Person() With { 
          .FirstName = dr.Item("FirstName").ToString(), 
          .Surname = dr.Item("Surname").ToString() 
          }).ToList() 
関連する問題