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