■【vb.net】LINQで匿名型じゃなく独自の型で返す方法
2010年11月25日 コメントを残す
よく、このようなことを書いてあるんだけど、よっぽど当たり前のことなのか、
具体的なやり方が書いていないので一応書いてみる。
以前投稿した記事のLINQクエリを、独自の型で返すように書き換えてみる 。
・以前の記事のクエリ式(を、より簡単に省略したもの。。)
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は当然匿名型となる。
・これを独自の型で返すように書き換える。
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。