添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
路过的香蕉  ·  【Android】BottomSheetDi ...·  1 年前    · 
单身的跑步鞋  ·  excel vba ...·  1 年前    · 

最近给朋友用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; }
        /// <summary>
        /// 页面代码
        /// </summary>
        public string Page { get; set; }
        /// <summary>
        /// 具体代码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 缓存记录
        /// </summary>
        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;
    

    当然了我这里只是简单的使用,连封装都没做。

    粉丝