■【vb.net】LINQで匿名型じゃなく独自の型で返す方法

よく、このようなことを書いてあるんだけど、よっぽど当たり前のことなのか、
具体的なやり方が書いていないので一応書いてみる。

以前投稿した記事のLINQクエリを、独自の型で返すように書き換えてみる 。

・以前の記事のクエリ式(を、より簡単に省略したもの。。)

Using context As New userEDM
Dim query = From a In context.user _
Select New With { a.id, a.name}
 

Dim result = query.FirstOrDefault()
Console.WriteLine(result.name)
End Using

こうすると、resultは当然匿名型となる。

・これを独自の型で返すように書き換える。

Class anonType
Public id As String
Public name As String
End Class
 

Using context As New userEDM
Dim query = From a In context.user _
Select New  anonType() With { .id = a.id, .name = a.name}

Dim result = query.FirstOrDefault()
Console.WriteLine(result.name)
End Using

こう書くことで、resultはanonType型として返される。

こういうことをしなければならない時って、匿名型はObject型で渡すしかないので、
その先でなにか取り出す処理をするときだろうけど、
本来返されるべき匿名型が複雑になるほど、独自の型の定義が複雑になってしまうので
こういうことは、やらないほうが良いとは思う。。

よくあるパターンとして、外部結合なんかをしてて、
IEnumerable(Of 匿名型)とかになってるとすると、
その中にキャスト可能な型が入ってるなら、
リフレクションでcast可能になる部分までは取り出して
それをcastするのが良いのかなぁ・・・と。。

まー、castの話をするなら、匿名型は同じ定義なら同じ型になることが保障されているので、
ダミーの匿名型を宣言して、それをジェネリックメソッドに引き渡して、型パラメータTを
型推論させて、DirectCast(src, T)とかしてやればcastは可能ではあるんだけど・・・
なんだかなぁ・・・みたいな。

(2010/12/25追記)
Classの部分は、構造体でもok。

コメントを残す