告别硬编码:用SqlSugar Expression动态构建多条件Left Join查询(附分页技巧)
告别硬编码用SqlSugar Expression动态构建多条件Left Join查询附分页技巧在后台管理系统开发中数据列表查询是最常见的需求之一。面对复杂的多表关联、动态筛选条件和分页需求很多开发者会陷入字符串拼接SQL的泥潭。这不仅带来SQL注入风险还让代码难以维护。本文将带你用SqlSugar的Expression特性优雅解决这些问题。1. 为什么需要动态构建查询传统硬编码SQL查询存在三个致命问题安全隐患字符串拼接容易导致SQL注入维护困难条件变更需要修改代码逻辑性能瓶颈无法利用ORM的缓存和优化机制SqlSugar提供的Expression树和链式调用API能让我们用强类型的方式构建动态查询。来看一个典型场景// 传统字符串拼接方式不推荐 .Where(a.UpdateTime startTime ) .Where(a.LogisticsNo LIKE % keyword %) // 表达式树方式推荐 .Where(a a.UpdateTime startTime) .WhereIF(!string.IsNullOrEmpty(keyword), a a.LogisticsNo.Contains(keyword))2. 多表Left Join的动态实现假设我们需要查询物流信息关联出库单和明细表以下是实现步骤2.1 基础Join结构var query db.QueryableLogistics, Order, OrderDetail() .LeftJoin((l, o, d) l.LogisticsNo o.LogisticsNo) .LeftJoin((l, o, d) d.OrderId o.Id)2.2 动态条件构建利用.WhereIF()实现条件分支query.WhereIF(!string.IsNullOrEmpty(logisticsType), (l, o, d) l.Type logisticsType) .WhereIF(!string.IsNullOrEmpty(keyword), (l, o, d) l.LogisticsNo.Contains(keyword)) .WhereIF(startTime.HasValue, (l, o, d) l.UpdateTime startTime.Value)2.3 安全处理IN查询对于IN查询不要拼接字符串// 错误做法 .Where(a.LogisticsNo IN ( ids )) // 正确做法 var idList ids.Split(,).Select(long.Parse).ToList(); query.Where((l, o, d) idList.Contains(l.Id))3. 高效分页方案对比SqlSugar提供多种分页方式各有优劣方法优点缺点适用场景ToPageList强类型返回需两次查询小数据量ToDataTablePage直接返回DataTable类型不安全快速开发ToSqlPage获取分页SQL需手动执行特殊需求推荐使用.ToDataTablePage的完整示例var pageResult query.Select((l, o, d) new { 运单号 l.LogisticsNo, 店铺名称 o.ShopName, 订单金额 d.Amount }) .ToDataTablePage(pageIndex, pageSize, ref totalCount);4. 封装通用查询服务将通用逻辑封装成服务方法public DataTablePageResult QueryLogistics(LogisticsQueryDto dto) { var query BuildBaseQuery(dto); ApplyConditions(query, dto); return query.ToDataTablePage(dto.PageIndex, dto.PageSize); } private ISugarQueryableLogistics, Order, OrderDetail BuildBaseQuery(LogisticsQueryDto dto) { return db.QueryableLogistics, Order, OrderDetail() .LeftJoin(...) .LeftJoin(...); } private void ApplyConditions(ISugarQueryableLogistics, Order, OrderDetail query, LogisticsQueryDto dto) { query.WhereIF(dto.StartTime.HasValue, (l, o, d) l.UpdateTime dto.StartTime) .WhereIF(...); }5. 性能优化技巧索引提示对高频查询字段添加[SugarColumn(IsIndex true)]查询裁剪只Select需要的字段缓存策略对稳定数据使用.WithCache()批量操作大数据量时使用.SplitTable()分表查询// 使用缓存示例 query.WithCache(60) // 缓存60秒在实际项目中我发现动态构建查询最大的价值不在于技术本身而是让团队形成了统一的数据库访问规范。当所有查询都通过Expression构建时代码审查和安全审计变得异常简单。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2487014.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!