2025-11-09
LiteDB
00

目录

基本准备:定义实体类
准备测试数据
LINQ 查询基础
简单查询
条件过滤详解
单一条件过滤
3.2 复杂条件过滤
排序操作
单一字段排序
多字段排序
分页查询
基本分页
高级分页(带总数)
聚合操作
基本聚合
分组聚合
高级查询技巧
复合查询
结语

当今快速发展的软件开发世界中,开发者需要既高效又灵活的数据存储解决方案。LiteDB 作为一个轻量级的 NoSQL 嵌入式数据库,以其简单、快速和强大的 LINQ 查询能力,成为 .NET 开发者的理想选择。

本指南将带您深入探索 LiteDB 查询的精髓,从基础的数据检索到复杂的聚合操作,全方位揭秘如何使用 LINQ 释放数据查询的全部潜能。无论您是刚入门的初学者,还是经验丰富的开发者,这篇文章都将为您提供实用、深入的技术洞察。

基本准备:定义实体类

C#
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; } public int Stock { get; set; } public DateTime CreatedAt { get; set; } }

准备测试数据

C#
using LiteDB; namespace App09 { internal class Program { static void Main(string[] args) { TestData(); } static void TestData() { // 创建测试数据 var products = new List<Product> { // 电子产品类别 new Product { Id = 1, Name = "Apple iPhone 13", Price = 799.99m, Category = "Electronics", Stock = 50, CreatedAt = DateTime.Now.AddDays(-30) }, new Product { Id = 2, Name = "Apple MacBook Pro", Price = 1299.99m, Category = "Electronics", Stock = 25, CreatedAt = DateTime.Now.AddDays(-45) }, new Product { Id = 3, Name = "Samsung Galaxy S21", Price = 699.99m, Category = "Electronics", Stock = 30, CreatedAt = DateTime.Now.AddDays(-15) }, new Product { Id = 4, Name = "Sony PlayStation 5", Price = 499.99m, Category = "Electronics", Stock = 0, CreatedAt = DateTime.Now.AddDays(-60) }, new Product { Id = 5, Name = "Apple AirPods Pro", Price = 249.99m, Category = "Electronics", Stock = 100, CreatedAt = DateTime.Now.AddDays(-20) } }; // 将数据插入到数据库 using (var db = new LiteDatabase(@"MyDatabase.db")) { var collection = db.GetCollection<Product>(); collection.InsertBulk(products); } } } }

LINQ 查询基础

简单查询

C#
using LiteDB; namespace App09 { internal class Program { static void Main(string[] args) { using (var db = new LiteDatabase("mydatabase.db")) { Console.WriteLine("查询所有产品"); // 查询所有产品 var allProducts = db.GetCollection<Product>() .FindAll(); foreach (var product in allProducts) { Console.WriteLine(product.Name); Console.WriteLine(product.Price); Console.WriteLine(product.Category); Console.WriteLine(product.Stock); Console.WriteLine(product.CreatedAt); Console.WriteLine("----------------------"); } Console.WriteLine("查询特定条件的产品"); // 查询特定条件的产品 var expensiveProducts = db.GetCollection<Product>() .Find(p => p.Price > 100); foreach (var product in expensiveProducts) { Console.WriteLine(product.Name); Console.WriteLine(product.Price); Console.WriteLine(product.Category); Console.WriteLine(product.Stock); Console.WriteLine(product.CreatedAt); Console.WriteLine("----------------------"); } Console.ReadKey(); } } } }

image.png

条件过滤详解

单一条件过滤

C#
using LiteDB; namespace App09 { internal class Program { static void Main(string[] args) { using (var db = new LiteDatabase("mydatabase.db")) { // 按类别过滤 var electronicsProducts = db.GetCollection<Product>() .Find(p => p.Category == "Electronics"); PrintProduct(electronicsProducts); // 多条件与(AND)查询 var highPriceElectronics = db.GetCollection<Product>() .Find(p => p.Category == "Electronics" && p.Price > 500); PrintProduct(highPriceElectronics); // 多条件或(OR)查询 var cheapOrOutOfStock = db.GetCollection<Product>() .Find(p => p.Price < 50 || p.Stock == 0); PrintProduct(cheapOrOutOfStock); } Console.ReadKey(); } static void PrintProduct(IEnumerable<Product> products) { foreach (var product in products) { Console.WriteLine(product.Name); Console.WriteLine(product.Price); Console.WriteLine(product.Category); Console.WriteLine(product.Stock); Console.WriteLine(product.CreatedAt); Console.WriteLine("----------------------"); } } } }

3.2 复杂条件过滤

C#
// 使用正则表达式 var nameMatchProducts = db.GetCollection<Product>() .Find(p => Regex.IsMatch(p.Name, "^Apple")); // 范围查询 var midRangeProducts = db.GetCollection<Product>() .Find(p => p.Price >= 100 && p.Price <= 500);

Regex.IsMatch(p.Name, "^Apple")是一个正则表达式匹配:

  • ^Apple表示匹配以"Apple"开头的字符串
  • ^符号表示字符串的开始位置

排序操作

单一字段排序

C#
// 按价格升序排序 var sortedByPriceAsc = db.GetCollection<Product>() .Find(p => p.Stock > 0) .OrderBy(p => p.Price) .ToList(); // 按价格降序排序 var sortedByPriceDesc = db.GetCollection<Product>() .Find(p => p.Stock > 0) .OrderByDescending(p => p.Price) .ToList();

多字段排序

C#
// 先按类别排序,再按价格排序 var complexSortedProducts = db.GetCollection<Product>() .Find(p => p.Stock > 0) .OrderBy(p => p.Category) .ThenByDescending(p => p.Price) .ToList();

分页查询

基本分页

C#
// 每页2条记录,获取第2页 int pageSize = 2; int pageIndex = 1; var pagedProducts = db.GetCollection<Product>() .Find(p => p.Stock > 0) .OrderBy(p => p.Price) .Skip(pageIndex * pageSize) .Take(pageSize) .ToList();

高级分页(带总数)

C#
public class PagedResult<T> { public List<T> Items { get; set; } public int TotalCount { get; set; } public int PageIndex { get; set; } public int PageSize { get; set; } }
C#
public PagedResult<Product> GetPagedProducts(int pageIndex, int pageSize) { var collection = db.GetCollection<Product>(); var totalCount = collection.Count(p => p.Stock > 0); var items = collection .Find(p => p.Stock > 0) .OrderBy(p => p.Price) .Skip(pageIndex * pageSize) .Take(pageSize) .ToList(); return new PagedResult<Product> { Items = items, TotalCount = totalCount, PageIndex = pageIndex, PageSize = pageSize }; }

聚合操作

基本聚合

C#
// 总库存 var totalStock = db.GetCollection<Product>() .Find(p => p.Category == "Electronics") .Sum(p => p.Stock); // 平均价格 var averagePrice = db.GetCollection<Product>() .Find(p => p.Category == "Electronics") .Average(p => p.Price); // 最高价格 var maxPrice = db.GetCollection<Product>() .Find(p => p.Category == "Electronics") .Max(p => p.Price);

分组聚合

C#
static void Main(string[] args) { using (var db = new LiteDatabase("mydatabase.db")) { // 按类别分组统计总库存 var stockByCategory = db.GetCollection<Product>() .FindAll() .GroupBy(p => p.Category) .Select(g => new { Category = g.Key, TotalStock = g.Sum(p => p.Stock), AveragePrice = g.Average(p => p.Price) }) .ToList(); foreach(var it in stockByCategory) { Console.WriteLine(it.Category); Console.WriteLine(it.TotalStock); Console.WriteLine(it.AveragePrice); } } Console.ReadKey(); }

image.png

高级查询技巧

复合查询

C#
var complexQuery = db.GetCollection<Product>() .Find(p => p.Category == "Electronics" && p.Price > 100 && p.Stock > 10 ) .OrderByDescending(p => p.CreatedAt) .Take(5) .ToList();

结语

LiteDB 的 LINQ 查询提供了强大且灵活的数据检索方式。通过掌握这些查询技术,您可以轻松处理各种复杂的数据查询场景。

注意事项:

  • 复杂查询可能会影响性能
  • 对大数据集使用索引
  • 适当使用 Take()Skip() 进行分页

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!