🚫 高效SQL/LINQ的陷阱:为什么你的查询变慢了?
低效的SQL或LINQ可能导致高数据读取成本与资源浪费。CPU过度消耗会引发应用响应延迟,甚至使服务器无法承载负载。
本文将解析14个LINQ性能优化技巧,助你构建高效查询。
Count
会遍历整个集合。// 差代码
bool exists = collection.Count(x => x.IsActive) > 0;
// 优化代码
bool exists = collection.Any(x => x.IsActive);
原理:Any
在找到首个匹配项后立即终止,减少迭代次数。
ToList()
会提前物化集合。// 差代码(强制物化)
var result = numbers.Where(n => n > 2).ToList().ForEach(Console.WriteLine);
// 优化代码
var result = numbers.Where(n => n > 2).ToList();
result.ForEach(Console.WriteLine);
原理:ForEach
直接操作集合,保留延迟求值优势。
Distinct
在大集合中性能低下。// 差代码
var names = collection.Select(x => x.Name).Distinct().ToList();
// 优化代码
var names = collection.Select(x => x.Name).ToHashSet();
对比:
• ToHashSet()
:O(n)时间复杂度,哈希机制快速去重
• Distinct()
:需创建枚举器,开销更高
// 优化代码(IQueryable)
IQueryable<Product> products = dbContext.Products.Where(p => p.Price > 100);
products.ToList(); // 服务端执行过滤
优势:过滤/排序在数据库端执行,减少数据传输量。
// 差代码
var result = collection.Where(x => list.Contains(x.Id)).ToList();
// 优化代码
var idSet = new HashSet<int>(list);
var result = collection.Where(x => idSet.Contains(x.Id)).ToList();
原理:HashSet
提供O(1)时间复杂度的存在性检查。
// 优化代码
var users = dbContext.Users.AsNoTracking().Where(x => x.IsActive).ToList();
效果:禁用变更跟踪,减少内存占用。
// 差代码
var user = collection.Where(x => x.Id == id).FirstOrDefault();
// 优化代码
var user = collection.FirstOrDefault(x => x.Id == id);
// 差代码
var result = collection.OrderBy(x => x.Name).Where(x => x.IsActive).ToList();
// 优化代码
var result = collection.Where(x => x.IsActive).OrderBy(x => x.Name).ToList();
// 优化代码
var result = collection.OrderBy(x => new { x.FirstName, x.LastName }).ToList();
原理:复合键排序减少迭代次数。
// 差代码
var activeUsers = dbContext.Users.ToList().Where(x => x.IsActive);
// 优化代码
var activeUsers = dbContext.Users.Where(x => x.IsActive).ToList();
// 优化代码
var count = collection.LongCount();
// 优化代码
var result = collection.Skip(10).Take(5).ToList();
// 优化代码
var result = collection.Where(x => x.IsActive).Select(x => new { x.Id, x.Name }).ToList();
// 优化代码
var result = collection.Where(x => x.IsActive).ToList();
性能优化核心原则:
✅ 延迟求值最大化
✅ 减少中间集合创建
✅ 利用数据库端处理能力
✅ 按需投影数据
通过这14个技巧,你可以显著提升LINQ查询性能,构建更高效的.NET应用。