最近给朋友用Winform配合Blazor写一个程序,朋友想要有个自动完成填充文本框的历史记录,按理说由服务端返回也可以实现,但是像浏览器那样,客户端有个本地存储其实好像也很不错,原本存储媒介想用常做嵌入式数据库的SQLite的,后面查了下资料发现一款NoSQL的LiteDB,已经迭代到5.0版本了,发现挺好用,类似于MongoDB,数据格式也是用Bson,重点还是纯C#写的,支持一下。
LiteDB
以下是官网简介(偷个懒,Copy了下):
LiteDB 一个小巧、快速、轻量级的 NoSQL 嵌入式数据库。
Serverless NoSQL 文档存储
类似于 MongoDB 的简单 API
100% C# 代码,支持 .NET 3.5 / .NET 4.0 / NETStandard 1.3 / NETStandard 2.0,单 DLL (小于 300 kb)
支持线程和进程安全
支持文档/操作级别的 ACID
支持写失败后的数据还原 (日志模式)
可使用 DES (AES) 加密算法进行数据文件加密
可使用特性或 fluent 映射 API 将你的 POCO 类映射为
BsonDocument
可存储文件与流数据 (类似 MongoDB 的 GridFS)
单数据文件存储 (类似 SQLite)
支持基于文档字段索引的快速搜索 (每个集合支持多达 16 个索引)
支持 LINQ 查询
Shell 命令行 -
试试这个在线版本
相当快 -
这里是与 SQLite 的对比结果
开源,对所有人免费 - 包括商业应用
可以从 NuGet 安装:
Install-Package LiteDB
可视化工具
按引导步骤,Nuget导入啊,命名空间引用什么的这里就不赘诉了
创建缓存实体
public class Autocomplete
public ObjectId Id { get; set; }
public string Page { get; set; }
public string Code { get; set; }
public List<string> Values { get; set; }
获取缓存得到自动完成的记录(BaseLiteDb.ConnStr是文件存放位置)
private async void GetAutocompletes()
using var db = new LiteDatabase(BaseLiteDb.ConnStr);
var col = db.GetCollection<Autocomplete>(nameof(Autocomplete));
var autocompletes = col.Find(o => o.Page == "AddOrder");
if (autocompletes?.Any() ?? false)
_dicAutocomplete = autocompletes.ToDictionary(o => o.Code, o => o.Values);
await Task.CompletedTask;
获取到信息后写入缓存,写入前先删除后新增保证唯一
private async void SetAutocomplete(string code, List<string> values)
using var db = new LiteDatabase(BaseLiteDb.ConnStr);
var col = db.GetCollection<Autocomplete>(nameof(Autocomplete));
var curAutocomplete = col.FindOne(o => o.Page == "AddOrder" && o.Code == code);
var autocomplete = new Autocomplete()
Page = "AddOrder",
Code = code
if (curAutocomplete?.Values?.Any() ?? false)
curAutocomplete.Values.Reverse();
curAutocomplete.Values.AddRange(values);
autocomplete.Values = curAutocomplete.Values.Take(5).ToList();
autocomplete.Values = values;
var del = col.DeleteMany(o => o.Page == "AddOrder" && o.Code == code);
var ins = col.Insert(autocomplete);
await Task.CompletedTask;
当然了我这里只是简单的使用,连封装都没做。
粉丝