当今快速发展的软件开发世界中,开发者需要既高效又灵活的数据存储解决方案。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);
}
}
}
}
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();
}
}
}
}

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("----------------------");
}
}
}
}
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();
}

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 许可协议。转载请注明出处!