.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
機能拡張など、こうしたら良いなどアイデアがあれば教えてください。



