まめログ

Javaプログラマの歩み

VB.NETでPostgreSQL 条件を指定してレコードを検索する(Entity Framework使用)

以下の記事の続きです。

mamelog.hatenablog.jp


次は条件を指定した検索処理を行いたいと思います。

前回のテーブルを少し修正し以下のようにします。
何期生かをレコードに持たせるようにしました。

create table Users (
  id serial
  , name character varying(30)
  , generation integer
  , constraint Users_PKC primary key (id)
) ;

comment on table Users is 'Users';
comment on column Users.id is 'ID';
comment on column Users.name is '名前';
comment on column Users.generation is '期';

Userクラスも以下のように修正します。

Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema

<Table("users")>
Public Class User

    <Key>
    <Column("id")>
    Public Property Id As Long

    <Column("name")>
    Public Property Name As String

    <Column("generation")>
    Public Property Generation As Integer

End Class

テーブルの中身は以下のようになっています。

f:id:mamepika:20150401170427j:plain

主キーで検索する

UserRepositoryクラスに以下のメソッドを追加します。
主キーであるidを引数に、usersテーブルから該当するレコードを1件返すメソッドです。

    Public Function FindById(ByVal id As Long) As User
        Return context.Users.Find(id)
    End Function

Formに適当にボタンを作成し、クリックイベントを以下のようにします。

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim userRepo As New UserRepository()

        Dim user = userRepo.FindById(1)
        MessageBox.Show(user.Name)
    End Sub

検索出来ました。
f:id:mamepika:20150401170428j:plain

主キー以外の条件で検索する

次に主キー以外の項目で検索をしてみようと思います。
追加したgenerationカラムで検索をします。

UserRepositoryクラスに以下のメソッドを追加します。
generationが引数と同じ値のレコードをリストにして返すメソッドです。

    Public Function FindByGeneration(ByVal generation As Integer) As List(Of User)
        Return context.Users.Where(Function(u) u.Generation = generation).ToList()
    End Function

Formに適当にボタンを作成し、クリックイベントを以下のようにします。

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim userRepo As New UserRepository()

        Dim list = userRepo.FindByGeneration(9)
        Dim message As New StringBuilder()
        list.ForEach(Sub(l) message.Append(l.Id).Append(vbTab).AppendLine(l.Name))
        MessageBox.Show(message.ToString())
    End Sub

9期のメンバーだけ検索することが出来ました。

f:id:mamepika:20150401170429j:plain