{"id":7979,"date":"2016-08-08T10:42:34","date_gmt":"2016-08-07T16:42:34","guid":{"rendered":"http:\/\/www.moonmile.net\/blog\/?p=7979"},"modified":"2016-08-08T10:46:09","modified_gmt":"2016-08-08T01:46:09","slug":"sqlite-%e3%81%a7-linq-%e3%82%92%e4%bd%bf%e3%81%86","status":"publish","type":"post","link":"http:\/\/www.moonmile.net\/blog\/archives\/7979","title":{"rendered":"SQLite \u3067 LINQ \u3092\u4f7f\u3046"},"content":{"rendered":"<p>\u3068\u6216\u308b\u3068\u3053\u308d\u3067\u3001\u3055\u3089\u3063\u3068\u7b54\u3048\u3066\u3057\u307e\u3063\u305f\u3089\u9593\u9055\u3063\u3066\u3044\u305f\u306e\u3067\u3001\u4ed5\u5207\u308a\u76f4\u3057\u304c\u3066\u3089\u306b\u9032\u5448\u81f4\u3057\u307e\u3059\u3002\u3069\u3046\u3084\u3089\u3001\u6614\u3001\u3069\u3053\u304b\u3067\u30aa\u30f3\u30e1\u30e2\u30ea\u306e\u8a2d\u5b9a\u3067\u4f7f\u3063\u3066\u3044\u3066\u305d\u306e\u77e5\u8b58\u304c\u305d\u306e\u307e\u307e\u3060\u3063\u305f\u3088\u3046\u3067\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u30d9\u30fc\u30b9\u3067\u52d5\u3044\u3066\u3044\u307e\u3059\u306d\u3001SQLite\u306f\u3002\u5f8c\u8ff0\u3057\u307e\u3059\u304c\u3001\u63a5\u7d9a\u6587\u5b57\u5217\u306e\u3068\u3053\u308d\u3067\u300cDataSource=sample.db\u300d\u306e\u3088\u3046\u306b\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u306f\u306a\u304f\u3066\u300cDataSource=:memory:\u300d\u306b\u3059\u308b\u3068\u30aa\u30f3\u30e1\u30e2\u30ea\u306eDB\u3068\u3057\u3066\u52d5\u4f5c\u3057\u307e\u3059\u3002<\/p>\n<h2>System.Data.SQLite \u3092\u4f7f\u3046<\/h2>\n<p>SQLite\u306e\u672c\u5bb6\u30b5\u30a4\u30c8\u304b\u3089\u843d\u3068\u3057\u3066\u3082\u3044\u3044\u306e\u3067\u3059\u304c\u3001\u624b\u3063\u53d6\u308a\u65e9\u304f NuGet \u3067\u843d\u3068\u3057\u307e\u3059\u3002<\/p>\n<p><a href=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/08\/dworkblogimage20160808_01org.jpg\"><img decoding=\"async\" src=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/08\/dworkblogimage20160808_01thum.jpg\" border=\"0\" \/><\/a><\/p>\n<p>.NET Core \u7528\u306b\u306f System.Data.SQLite.Core \u304c\u3042\u308b\u306e\u3068\u3001Windows IoT Core \u306e\u3088\u3046\u306a UWP \u30a2\u30d7\u30ea\u3067\u5185\u90e8\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u6271\u3046\u306e\u306b SQLite \u4e00\u629e\u3068\u306a\u308b\u306e\u3067\u3001\u4e00\u5ea6\u4f7f\u3063\u3066\u307f\u308b\u3068\u3044\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002NuGet \u306b\u306f\u300cMicrosoft.Data.SQLite\u300d\u3082\u3042\u308b\u306e\u3067\u3001\u591a\u5c11\u4e71\u7acb\u304e\u307f\u306a\u306e\u304b\u3082\u3002<\/p>\n<h2>SQLite\u306b\u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u308b<\/h2>\n<p>\u5b9f\u9a13\u7528\u306b users \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u308a\u307e\u3059\u3002SQL\u6587\u306f\u3001\u4e00\u5ea6 PupSQLite \u3067\u4f5c\u3063\u305f\u3082\u306e\u304b\u3089\u5410\u304d\u51fa\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>Pup&#8217;s Atelier-Software<br \/>\n<a href=\"https:\/\/www.eonet.ne.jp\/~pup\/software.html\">https:\/\/www.eonet.ne.jp\/~pup\/software.html<\/a><\/p>\n<p><a href=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/08\/dworkblogimage20160808_02org.jpg\"><img decoding=\"async\" src=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/08\/dworkblogimage20160808_02thum.jpg\" border=\"0\" \/><\/a><\/p>\n<p>\u30aa\u30f3\u30e1\u30e2\u30ea\u306b\u3059\u308b\u5834\u5408\u306f\u3001\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3092\u30af\u30ed\u30fc\u30ba\u3059\u308b\u305f\u3073\u306b\u7121\u304f\u306a\u3063\u3066\u3057\u307e\u3046\uff08\u63ee\u767a\u6027\uff09\u306a\u306e\u3067\u3001\u30a2\u30d7\u30ea\u304c\u8d77\u52d5\u3057\u305f\u3068\u304d\u306b\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3092\u958b\u3044\u3066\u3001\u7d42\u308f\u308b\u3068\u304d\u306b\u9589\u3058\u308b\u3068\u3044\u3046\u5177\u5408\u3067\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n{\r\n    string sql = @&quot;\r\nCREATE TABLE &#x5B;users] (\r\n&#x5B;id] VARCHAR(256),\r\n&#x5B;username] VARCHAR(256) NOT NULL,\r\n&#x5B;email] VARCHAR(256),\r\n&#x5B;birthday] DATETIME,\r\n&#x5B;age] INTEGER,\r\n&#x5B;memo1] VARCHAR(256),\r\n&#x5B;memo2] VARCHAR(256),\r\n&#x5B;memo3] VARCHAR(256),\r\n&#x5B;memo4] VARCHAR(256),\r\n&#x5B;memo5] VARCHAR(256),\r\n&#x5B;memo6] VARCHAR(256),\r\n&#x5B;memo7] VARCHAR(256),\r\n&#x5B;memo8] VARCHAR(256),\r\n&#x5B;memo9] VARCHAR(256),\r\n&#x5B;memo10] VARCHAR(256),\r\nPRIMARY KEY(id)\r\n);&quot;;\r\n    var cn = new SQLiteConnection(&quot;DataSource=&quot; + db_file);\r\n    var cmd = new SQLiteCommand(sql, cn);\r\n    cn.Open();\r\n    cmd.ExecuteNonQuery();\r\n    cn.Close();\r\n    textMsg.Text = &quot;Users \u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f&quot;;\r\n}\r\n<\/pre>\n<p>Memo1 \u304b\u3089 Memo10 \u306e\u30c7\u30fc\u30bf\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u5de8\u5927\u306b\u3059\u308b\u305f\u3081\u306e\u30c0\u30df\u30fc\u30c7\u30fc\u30bf\u7528\u3067\u3059\u3002\u3053\u306e\u30c6\u30fc\u30d6\u30eb\u3067\u4f5c\u308b\u306810\u4e07\u4ef6\u3067\u3001500MB \u3050\u3089\u3044\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u3067\u304d\u3042\u304c\u308a\u307e\u3059\u3002<\/p>\n<h2>User\u30af\u30e9\u30b9\u3092\u4f5c\u308b<\/h2>\n<p>LINQ \u3067\u4f7f\u3048\u308b\u3088\u3046\u306b Entity \u30af\u30e9\u30b9\u3092\u4f5c\u308a\u307e\u3059\u3002<br \/>\n\u30ab\u30e9\u30e0\u306e\u578b\u306f\u6307\u5b9a\u3057\u306a\u304f\u3066\u3082\u3001\u3046\u307e\u304f\u30de\u30c3\u30d4\u30f3\u30b0\u3067\u304d\u3066\u3044\u307e\u3059\u3002Table\u5c5e\u6027\u3068Column\u5c5e\u6027\u306eName\u3092\u6307\u5b9a\u3059\u308c\u3070ok\u3067\u3059\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nusing System.Data.Linq.Mapping;\r\n\r\n&#x5B;Table(Name =&quot;users&quot;)]\r\nclass User\r\n{\r\n    &#x5B;Column(Name =&quot;id&quot;, IsPrimaryKey = true )]\r\n    public string Id { get; set; }\r\n    &#x5B;Column(Name = &quot;username&quot;, CanBeNull = false)]\r\n    public string UserName { get; set; }\r\n    &#x5B;Column(Name = &quot;email&quot;,CanBeNull = true)]\r\n    public string Email { get; set; }\r\n    &#x5B;Column(Name = &quot;birthday&quot;, CanBeNull = true)]\r\n    public DateTime? Birthday { get; set; }\r\n    &#x5B;Column(Name = &quot;age&quot; ,CanBeNull = true)]\r\n    public int? Age { get; set; }\r\n\r\n    &#x5B;Column(Name = &quot;memo1&quot;)]\r\n    public string Memo1 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo2&quot;)]\r\n    public string Memo2 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo3&quot;)]\r\n    public string Memo3 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo4&quot;)]\r\n    public string Memo4 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo5&quot;)]\r\n    public string Memo5 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo6&quot;)]\r\n    public string Memo6 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo7&quot;)]\r\n    public string Memo7 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo8&quot;)]\r\n    public string Memo8 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo9&quot;)]\r\n    public string Memo9 { get; set; }\r\n    &#x5B;Column(Name = &quot;memo10&quot;)]\r\n    public string Memo10 { get; set; }\r\n}\r\n<\/pre>\n<h2>\u691c\u7d22\u7528\u306e LINQ<\/h2>\n<p>System.Data.Linq\u3092\u53c2\u7167\u8a2d\u5b9a\u3057\u3066\u304a\u3044\u3066\u3001DataContext\u30af\u30e9\u30b9\u3092\u4f7f\u3044\u307e\u3059\u3002\u30c6\u30fc\u30d6\u30eb\u3092\u53c2\u7167\u3059\u308b\u3068\u304d\u306f\u3001GetTable\u30e1\u30bd\u30c3\u30c9\u3067\u6307\u5b9a\u306e\u30c6\u30fc\u30d6\u30eb\u3092\u53d6\u5f97\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate void clickCount(object sender, RoutedEventArgs e)\r\n{\r\n    var sw = new Stopwatch();\r\n    sw.Start();\r\n    var cn = new SQLiteConnection(&quot;DataSource=&quot; + db_file);\r\n    var context = new DataContext(cn);\r\n    var users = context.GetTable&lt;User&gt;();\r\n    int count = users.Count();\r\n\r\n    textMsg.Text = $&quot;{count} \u4ef6\u306e\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u3059&quot;;\r\n    textTime.Text = $&quot;{sw.ElapsedMilliseconds} msec&quot;;\r\n}\r\n<\/pre>\n<p>\u3059\u308b\u3068\u3001LINQ \u304c\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u306e\u3067\u3001where\u6587\u306a\u3069\u3092\u4f7f\u3063\u3066\u6761\u4ef6\u3092\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate void clickAge(object sender, RoutedEventArgs e)\r\n{\r\n    var sw = new Stopwatch();\r\n    sw.Start();\r\n    var cn = new SQLiteConnection(&quot;DataSource=&quot; + db_file);\r\n    var context = new DataContext(cn);\r\n    var users = context.GetTable&lt;User&gt;();\r\n    var q = from t in users\r\n            where 40 &lt;= t.Age &amp;&amp; t.Age &lt; 50\r\n            select t;\r\n    var count = q.Count();\r\n    sw.Stop();\r\n    textMsg.Text = $&quot;{count} \u4ef6\u306e\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u3059&quot;;\r\n    textTime.Text = $&quot;{sw.ElapsedMilliseconds} msec&quot;;\r\n}\r\n<\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/08\/dworkblogimage20160808_04.jpg\" border=\"0\" \/><\/p>\n<p>10\u4e07\u4ef6\u306e\u30c7\u30fc\u30bf\u3092\u691c\u7d22\u3057\u305f\u3068\u3053\u308d\uff08\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306a\u3057\uff09\u3001300 mesc \u3061\u3087\u3063\u3068\u3067\u8fd4\u3063\u3066\u6765\u307e\u3059\u3002<\/p>\n<p>\u30e1\u30e2\u30ea\u306e\u5177\u5408\u306f\u3069\u3046\u304b\u3068\u3044\u3046\u3068\u3001Working set \u306e private \u304c 30 MB \u7a0b\u5ea6\u3002\u3053\u306e\u3068\u304d sample.db \u30d5\u30a1\u30a4\u30eb\u306e\u5927\u304d\u3055\u306f 500MB \u7a0b\u5ea6\u3042\u308b\u306e\u3067\u3001\u30d5\u30a1\u30a4\u30eb\u30a2\u30af\u30bb\u30b9\u3092\u3057\u3066\u3044\u307e\u3059\u3002\u5e74\u9f62\u3067\u691c\u7d22\u3059\u308b\u305f\u3081\u306b clickAge \u3092\u547c\u3073\u51fa\u3057\u305f\u77ac\u9593\u306b HDD \u30a2\u30af\u30bb\u30b9\u304c\u5927\u91cf\u767a\u751f\u3057\u3066\u307e\u3059\u3002<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/08\/dworkblogimage20160808_06.jpg\" border=\"0\" \/><\/p>\n<p>\u3068\u306a\u308b\u3068\u691c\u7d22\u30b9\u30d4\u30fc\u30c9\u306f HDD\/SSD \u306e\u30b9\u30d4\u30fc\u30c9\u306b\u4f9d\u308b\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u306d\u3002<\/p>\n<h2>\u30c7\u30fc\u30bf\u4f5c\u6210<\/h2>\n<p>\u30c7\u30fc\u30bf\u4f5c\u6210\u3092\u3059\u308b INSERT \u306f\u610f\u5916\u3068\u9045\u3044\u3067\u3059\u3002\u30ed\u30b8\u30c3\u30af\u304c\u591a\u5c11\u8907\u96d1\u3060\u3068\u3044\u3046\u306e\u3082\u3042\u308b\u3093\u3067\u3057\u3087\u3046\u304c\u30011000\u4ef6\u4f5c\u308b\u306e\u306b7\u79d2\u7a0b\u5ea6\u304b\u304b\u308a\u307e\u3059\u3002\u30aa\u30f3\u30e1\u30e2\u30ea\u306b\u3059\u308b\u3068 300msec \u7a0b\u5ea6\u306a\u306e\u3067 insert \u30b9\u30d4\u30fc\u30c9\u304c 20\u500d\u3050\u3089\u3044\u9055\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate void clickCreateData(object sender, RoutedEventArgs e)\r\n{\r\n    var cn = new SQLiteConnection(&quot;DataSource=&quot; + db_file); \/\/  &quot;;SyncMode=off;JournalMode=Memory&quot;);\r\n    var context = new DataContext(cn);\r\n    var users = context.GetTable&lt;User&gt;();\r\n    _rnd = new Random();\r\n    int max = int.Parse(textSize.Text);\r\n    var sw = new Stopwatch();\r\n    sw.Start();\r\n    for ( int i=1; i&lt;=max; i++ )\r\n    {\r\n        users.InsertOnSubmit(makeUser());\r\n        if ( i % 100 == 0 )\r\n        {\r\n            context.SubmitChanges();\r\n            Debug.WriteLine($&quot;{i} \u4ef6 \u633f\u5165...&quot;);\r\n        }\r\n    }\r\n    context.SubmitChanges();\r\n    sw.Stop();\r\n    textMsg.Text = $&quot;{max} \u4ef6\u306e\u30c7\u30fc\u30bf\u3092\u633f\u5165\u3057\u307e\u3057\u305f&quot;;\r\n    textTime.Text = $&quot;{sw.ElapsedMilliseconds} msec&quot;;\r\n}\r\n\r\nprivate User makeUser()\r\n{\r\n    var user = new User();\r\n    user.Id = Guid.NewGuid().ToString(&quot;D&quot;);\r\n    user.UserName = createName();\r\n    user.Email = createEmail(user.UserName);\r\n    user.Birthday = null;\r\n    user.Age = _rnd.Next(10, 100);\r\n    user.Memo1 = createMemo();\r\n    user.Memo2 = createMemo();\r\n    user.Memo3 = createMemo();\r\n    user.Memo4 = createMemo();\r\n    user.Memo5 = createMemo();\r\n    user.Memo6 = createMemo();\r\n    user.Memo7 = createMemo();\r\n    user.Memo8 = createMemo();\r\n    user.Memo9 = createMemo();\r\n    user.Memo10 = createMemo();\r\n\r\n    return user;\r\n}\r\nprivate string createName()\r\n{\r\n    \/\/ xxxxxx xxxxxx\r\n    var name = &quot;Aaaaaa Aaaaaa&quot;;\r\n    var ch = name.ToCharArray();\r\n    for (int i = 0; i &lt; ch.Length; i++) {\r\n        if (ch&#x5B;i] == ' ') continue;\r\n        ch&#x5B;i] = (char)(ch&#x5B;i] + _rnd.Next(26));\r\n    }\r\n    return new string(ch);\r\n}\r\nprivate string createEmail( string username )\r\n{\r\n    \/\/ xxxxxx xxxxxx\r\n    var name = username.Split(' ')&#x5B;0];\r\n    return name + &quot;@mail.com&quot;;\r\n}\r\nprivate string createMemo(int size = 256)\r\n{\r\n    var ch = new char&#x5B;size];\r\n    for (int i = 0; i &lt; size; i++)\r\n    {\r\n        ch&#x5B;i] = (char)('A' + _rnd.Next(26));\r\n    }\r\n    return new string(ch);\r\n}\r\n<\/pre>\n<p>\u6a5f\u4f1a\u3092\u4f5c\u3063\u3066\u3001.NET Core \u306e\u307b\u3046\u306e SQLite \u3082\u8a66\u3057\u3066\u307f\u308b\u3068\u3044\u3046\u3053\u3068\u3067\u3002<\/p>\n<h2>\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9<\/h2>\n<p>\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u306f\u3053\u3061\u3089<br \/>\n<a href=\"https:\/\/1drv.ms\/u\/s!AmXmBbuizQkXgfsUYttAgWYXnhiogw\">https:\/\/1drv.ms\/u\/s!AmXmBbuizQkXgfsUYttAgWYXnhiogw<\/a><\/p>\n<h2>\u53c2\u8003\u5148<\/h2>\n<p>C# \u3067 SQLite \u3092\u4fbf\u5229\u306b\u4f7f\u3046\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\uff08LINQ to SQLite\uff09 &#8211; \u7fd4\u661f Be \u30e9\u30f3\u30c9\u65e5\u8a18<br \/>\n<a href=\"http:\/\/shinta0806be.ldblog.jp\/archives\/9084539.html\">http:\/\/shinta0806be.ldblog.jp\/archives\/9084539.html<\/a><\/p>\n<p>In-Memory Databases<br \/>\n<a href=\"https:\/\/www.sqlite.org\/inmemorydb.html\">https:\/\/www.sqlite.org\/inmemorydb.html<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3068\u6216\u308b\u3068\u3053\u308d\u3067\u3001\u3055\u3089\u3063\u3068\u7b54\u3048\u3066\u3057\u307e\u3063\u305f\u3089\u9593\u9055\u3063\u3066\u3044\u305f\u306e\u3067\u3001\u4ed5\u5207\u308a\u76f4\u3057\u304c\u3066\u3089\u306b\u9032\u5448\u81f4\u3057\u307e\u3059\u3002\u3069\u3046\u3084\u3089\u3001\u6614\u3001\u3069\u3053\u304b\u3067\u30aa\u30f3\u30e1\u30e2\u30ea\u306e\u8a2d\u5b9a\u3067\u4f7f\u3063\u3066\u3044\u3066\u305d\u306e\u77e5\u8b58\u304c\u305d\u306e\u307e\u307e\u3060\u3063\u305f\u3088\u3046\u3067\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u30d9\u30fc\u30b9\u3067\u52d5\u3044\u3066\u3044\u307e\u3059\u306d\u3001SQLite\u306f &hellip; <a href=\"http:\/\/www.moonmile.net\/blog\/archives\/7979\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[88],"tags":[],"class_list":["post-7979","post","type-post","status-publish","format-standard","hentry","category-sqlite"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=7979"}],"version-history":[{"count":4,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7979\/revisions"}],"predecessor-version":[{"id":7983,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7979\/revisions\/7983"}],"wp:attachment":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=7979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=7979"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=7979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}