之前就有写过LiteDB数据库相关的一篇文章,不过内容比较简单,简单的增删查改,最近项目中又有场景要用到数据库,索性重新写了一篇。
LiteDBHelper.cs
LiteDBHelper.cs
public sealed class LiteDBHelper { private static readonly Lazy<LiteDBHelper> lazy = new Lazy<LiteDBHelper>(() => new LiteDBHelper()); public static LiteDBHelper Instance { get { return lazy.Value; } } private LiteDBHelper() { } public LiteDB.LiteDatabase db = new LiteDB.LiteDatabase(GetDBPath()); public ILiteCollection<A1DataModel> GetA1DataModel() { return db.GetCollection<A1DataModel>(); } public ILiteCollection<A2DataModel> GetA2DataModel() { return db.GetCollection<A2DataModel>(); } public ILiteCollection<B1DataModel> GetB1DataModel() { return db.GetCollection<B1DataModel>(); } public ILiteCollection<B2DataModel> GetB2DataModel() { return db.GetCollection<B2DataModel>(); } public static string GetDBPath() { string connectionString = string.Concat(Globals.Dir_Record_MesData, DateTime.Now.ToString("yyyy-MM-dd"), "\\"); if (!Directory.Exists(connectionString)) { Directory.CreateDirectory(connectionString); } connectionString = connectionString + $"/MesData{DateTime.Now.ToString("yyyyMMdd")}.db"; if (!File.Exists(connectionString)) { File.Create(connectionString).Dispose(); //创建完文件之后,要把资源释放掉,才能继续往文件里书写内容 } return connectionString; } public class A1DataModel { public ObjectId Id { get; set; }//唯一标志,序号 public int CellId { get; set; }//穴位号码 public string StrNo { get; set; }//串码 public DateTime datetime { get; set; }//获取到的时间 public int IsUpload { get; set; }//是否上传了 public DateTime ModifyTime { get; set; }//最后修改时间 } public class A2DataModel { public ObjectId Id { get; set; }//唯一标志,序号 public int CellId { get; set; }//穴位号码 public string StrNo { get; set; }//串码 public DateTime datetime { get; set; }//获取到的时间 public int IsUpload { get; set; }//是否上传了 public DateTime ModifyTime { get; set; }//最后修改时间 } public class B1DataModel { public ObjectId Id { get; set; }//唯一标志,序号 public int CellId { get; set; }//穴位号码 public string StrNo { get; set; }//串码 public DateTime datetime { get; set; }//获取到的时间 public int IsUpload { get; set; }//是否上传了 public DateTime ModifyTime { get; set; }//最后修改时间 } public class B2DataModel { public ObjectId Id { get; set; }//唯一标志,序号 public int CellId { get; set; }//穴位号码 public string StrNo { get; set; }//串码 public DateTime datetime { get; set; }//获取到的时间 public int IsUpload { get; set; }//是否上传了 public DateTime ModifyTime { get; set; }//最后修改时间 } }
这个位置,我将四个实体模型都写进了这个单例里面,这样方便看一下,同时单例模式也是运用的Lazy 延迟加载对象,来实现对象的线程安全。
接下来我们看如果引用这些操作。
数据的增删查改
var db = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel(); for (int i = 1; i < 11; i++) { db.Insert(new A1DataModel() { CellId = i, datetime = DateTime.Now, IsUpload = i % 2 == 0 ? 0 : 1, StrNo = Guid.NewGuid().ToString().Replace("-", "").ToUpper() }); Thread.Sleep(50); } var gg = db.Query().Where(x => x.datetime.ToString().Contains("2022")).OrderByDescending(x=>x.datetime).ToList(); dgv_data.DataSource = gg;
A1DataModel dt1 = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().FindOne(x => x.StrNo == strNo); dgv_data.DataSource = dt1;
使用LinqToSQL
使用LinqToSQL进行条件查询以及筛选
List<A1DataModel> ls = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().Query().ToList();
var qulist = (from c in ls
orderby
c.datetime ascending
where c.IsUpload == 0
select c.StrNo).Take(1).ToList();
string val = qulist[0].ToString();
dgv_data.DataSource = val;
进行查询修改操作
A1DataModel am1 = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().FindOne(x => x.StrNo == strNoinfo);
am1.IsUpload = 1;
am1.ModifyTime = DateTime.Now;
am1.CellId = cellIndex;
result = LiteDataBase.LiteDBHelper.Instance.GetA1DataModel().Update(am1);
LiteDB是一个小型、快速、轻量级的.NET NoSQL嵌入式数据库。
- Serverless NoSQL Document Store
- 简单的API,类似于MongoDB
- 单个DLL中.NET 4.5/NETStandard1.3/2.0的100%C代码(小于450kb)
- Thread-safe
- 具有完整事务支持的ACID
- 写入失败后的数据恢复(WAL日志文件)
- 使用DES(AES)加密的数据文件加密
- 使用属性或fluent mapper API将您的POCO类映射到
BsonDocument
- 存储文件和流数据(如MongoDB中的GridFS)
- 单数据文件存储(如SQLite)
- 索引文档字段以进行快速搜索
- LINQ对查询的支持
- SQL-Like访问/转换数据的命令
- LiteDB Studio-用于数据访问的漂亮UI
- 开源,人人免费-包括商业用途
- 从NuGet安装:
Install-Package LiteDB
New v5
- 新的存储引擎
read
操作没有锁(多个读卡器)- 每个集合
Write
个锁(多个写入程序)- Internal/System collections
- New
SQL-Like Syntax
- 新的查询引擎(支持投影、排序、筛选、查询)
- 部分文档加载(根级别)