SqlSugar在.NET Core中的高效CRUD操作:从入门到精通

发布时间:2026/7/11 11:24:25

SqlSugar在.NET Core中的高效CRUD操作:从入门到精通 SqlSugar在.NET Core中的高效CRUD操作从入门到精通当你在.NET Core项目中需要处理数据库操作时ORM框架的选择往往决定了开发效率和代码质量。SqlSugar作为国内开发者广泛使用的轻量级ORM以其简洁的API设计和高性能著称。不同于Entity Framework的复杂配置SqlSugar提供了更符合中国开发者习惯的链式调用和直观的Lambda表达式支持。在实际企业级开发中我们经常面临这样的挑战如何快速实现复杂的多表查询怎样保证批量操作时的性能能否简化日常CRUD的模板代码这些问题在SqlSugar中都能找到优雅的解决方案。本文将带你从基础配置开始逐步深入到高级查询技巧最后分享一些提升性能的实战经验。1. 环境配置与基础操作1.1 初始化SqlSugarClientSqlSugar的配置非常灵活推荐在.NET Core中使用依赖注入方式初始化。首先通过NuGet安装SqlSugarCore包dotnet add package SqlSugarCore然后在Startup.cs中配置服务services.AddScopedISqlSugarClient(provider new SqlSugarClient(new ConnectionConfig { ConnectionString Configuration.GetConnectionString(Default), DbType DbType.SqlServer, IsAutoCloseConnection true, InitKeyType InitKeyType.Attribute }) );注意生产环境建议将连接字符串放在Azure Key Vault或环境变量中而非直接写在配置文件中。1.2 基础CRUD示例SqlSugar的基础操作非常直观以下是一个完整的用户管理示例public class UserService { private readonly ISqlSugarClient _db; public UserService(ISqlSugarClient db) _db db; // 插入 public int AddUser(User user) _db.Insertable(user).ExecuteReturnIdentity(); // 更新 public bool UpdateUser(User user) _db.Updateable(user).ExecuteCommandHasChange(); // 删除 public bool DeleteUser(int id) _db.DeleteableUser(id).ExecuteCommandHasChange(); // 查询 public User GetUser(int id) _db.QueryableUser().First(x x.Id id); }2. 高级查询技巧2.1 链式查询构建SqlSugar最强大的特性之一是其流畅的链式查询语法。比如我们需要查询最近30天活跃的VIP用户var users _db.QueryableUser() .Where(u u.IsVip u.LastLoginTime DateTime.Now.AddDays(-30)) .OrderBy(u u.LastLoginTime, OrderByType.Desc) .Select(u new UserDto { Id u.Id, Name u.Name, Email u.Email }) .ToList();2.2 多表关联查询处理复杂关联查询时SqlSugar提供了多种Join方式。以下是一个订单关联产品和用户的示例var orders _db.QueryableOrder() .LeftJoinProduct((o, p) o.ProductId p.Id) .LeftJoinUser((o, u) o.UserId u.Id) .Where((o, p, u) p.Price 100 u.IsVip) .Select((o, p, u) new OrderView { OrderNo o.No, ProductName p.Name, UserName u.Name, TotalAmount o.Quantity * p.Price }) .ToList();2.3 分页与聚合查询分页查询是业务系统的常见需求SqlSugar提供了高性能的分页实现var page _db.QueryableProduct() .Where(p p.Category Electronics) .OrderBy(p p.Price) .ToPageList(pageNumber: 1, pageSize: 10, ref totalCount);对于统计查询可以使用聚合函数var stats _db.QueryableOrder() .GroupBy(o o.ProductId) .Select(o new { ProductId o.ProductId, TotalSales SqlFunc.AggregateSum(o.Quantity), AvgPrice SqlFunc.AggregateAvg(o.UnitPrice) }) .ToList();3. 性能优化策略3.1 批量操作优化相比单条操作批量操作能显著提升性能。SqlSugar提供了多种批量操作方法// 批量插入返回插入后的ID列表 var ids _db.Insertable(userList).ExecuteReturnIdentity(); // 批量更新按主键 _db.Updateable(userList).ExecuteCommand(); // 批量删除 _db.DeleteableUser().Where(u ids.Contains(u.Id)).ExecuteCommand();3.2 读写分离配置对于高并发系统可以配置读写分离var db new SqlSugarClient(new ListConnectionConfig { new ConnectionConfig { ConfigId write, ConnectionString writeConn, DbType DbType.MySql }, new ConnectionConfig { ConfigId read1, ConnectionString readConn1, DbType DbType.MySql }, new ConnectionConfig { ConfigId read2, ConnectionString readConn2, DbType DbType.MySql } }, db { db.GetConnection(write); // 默认写库 db.GetConnection(SlaveConnectionConfigs { // 读库负载均衡 SlaveConnectionConfigs.Add(read1); SlaveConnectionConfigs.Add(read2); }); });3.3 二级缓存实现减少数据库访问的有效方法是使用缓存。SqlSugar内置了缓存机制var products _db.QueryableProduct() .Where(p p.Category Books) .WithCache(60) // 缓存60秒 .ToList();4. 实战技巧与最佳实践4.1 使用AOP实现审计日志SqlSugar的AOP功能可以在不修改业务代码的情况下实现横切关注点var db new SqlSugarClient(config { config.Aop.OnLogExecuting (sql, pars) { logger.Info($执行SQL: {sql}); // 可以记录审计日志或执行SQL分析 }; config.Aop.OnError exp { logger.Error(exp); }; });4.2 动态表名处理在多租户系统中动态表名是常见需求// 按租户ID动态切换表名 _db.QueryableUser().AS($Tenant_{tenantId}_Users).ToList(); // 按时间分表 var tableName $Log_{DateTime.Now:yyyyMM}; _db.Insertable(log).AS(tableName).ExecuteCommand();4.3 事务管理最佳实践SqlSugar提供了灵活的事务管理方式// 方式1使用Ado事务 _db.Ado.BeginTran(); try { _db.Insertable(user1).ExecuteCommand(); _db.Updateable(user2).ExecuteCommand(); _db.Ado.CommitTran(); } catch { _db.Ado.RollbackTran(); } // 方式2使用事务特性 [Transactional] public void TransferMoney(int fromId, int toId, decimal amount) { _db.UpdateableUser().SetColumns(u u.Balance - amount).Where(u u.Id fromId).ExecuteCommand(); _db.UpdateableUser().SetColumns(u u.Balance amount).Where(u u.Id toId).ExecuteCommand(); }在大型项目中我发现将复杂查询封装到仓储层特别有用。比如处理带有多种过滤条件的订单查询时可以构建动态查询表达式public ListOrder QueryOrders(OrderQuery query) { var exp Expressionable.CreateOrder(); if (query.StartTime.HasValue) exp.And(o o.CreateTime query.StartTime); if (query.EndTime.HasValue) exp.And(o o.CreateTime query.EndTime); if (!string.IsNullOrEmpty(query.Keyword)) exp.And(o o.No.Contains(query.Keyword) || o.Remark.Contains(query.Keyword)); return _db.QueryableOrder() .Where(exp.ToExpression()) .ToList(); }

相关新闻