2013年1月23日水曜日

.NET 軽量ORマッパー


.NETでORマッパー関連が充実していなくて困った。
.NET標準のADO.net Entity frameworkを使えばモデリングからある程度自動生成してくれるが、
pythonのdjangoのORマッパーを味わってしまうとめんどくさい。。
Ironpythonを使って、メイン言語をPythonにして画面だけWPFにしようとも考えたけど、これもめんどくさい。。

MySQLなど大規模なファイルでない、ちょっとしたパラメータをファイルに保存しておきたいだけなのに、どうしたものか。
探しても無いから自分でJson形式なORマッパーを作ってみた。

仕様は、
 ・データ保存形式は、 jsonを使用。
 ・ORマッパーでModelクラス経由でアクセス。
 ・検索機能は、Linqを使う。

これだけで十分と思う人向け。


Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json
Imports System.ComponentModel
Imports System.IO

Public Class BookModel
    <displayname("書籍名")>
    Public Property Name As String = ""
    <displayname("バーコード")>
    Public Property BCode As String = ""
    <displayname("ページ数")>
    Public Property Pages As Integer = 0
    <displayname("価格")>
    Public Property Price As Integer = 0

    Public Sub New(ByVal name As String, ByVal bcode As String, ByVal pages As Integer, ByVal price As Integer)
        With Me
            .Name = name
            .BCode = bcode
            .Pages = pages
            .Price = price
        End With
    End Sub
End Class

Class BookCollection : Implements IListSource
    Public Property models As New List(Of BookModel)
#Region "IListSource"
    Private bindsrc As New BindingSource
    Public ReadOnly Property ContainsListCollection As Boolean Implements IListSource.ContainsListCollection
        Get
            Return False
        End Get
    End Property
    Public Function GetList() As IList Implements IListSource.GetList
        bindsrc.DataSource = models
        Return bindsrc
    End Function
#End Region
#Region "ファイル操作"
    Public Sub Save(ByVal fname As String)
        Dim json As String = JsonConvert.SerializeObject(models)
        File.WriteAllText(fname, json)
    End Sub
    Public Sub Load(ByVal fname As String, typ As Type)
        Dim json As String = File.ReadAllText(fname)
        json = json.Replace(vbTab, "").Replace("\", "\\")
        models = JsonConvert.DeserializeObject(Of List(Of BookModel))(json)
        bindsrc.ResetBindings(False)
    End Sub
#End Region
End Class
使い方例:
        'データ定義
        Dim bc As New BookCollection()
        bc.models.Add(New BookModel("書籍1", "4987185712345", 100, 100))
        bc.models.Add(New BookModel("書籍2", "4987185712346", 110, 200))
        bc.models.Add(New BookModel("書籍3", "4987185712347", 120, 300))

        '保尊
        co.Save("d:\test.json")

        '読込
        co.Load("d:\test.json", rack.GetType())

        '条件検索
        Dim filter = From x In bc.models Where x.Price >= 200 Select x
        For Each model As BookModel In filter
            Console.WriteLine(model.Name)
        Next

        'DataGridViewで表示する
        DataGridView1.DataSource = co.models
        DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
機能拡張など、こうしたら良いなどアイデアがあれば教えてください。
コメントを投稿

Androider