using SqlSugar; using Web.Core.Entities.Response; using Web.Core.Exceptions; namespace Web.Core.DataBase { public static class SqlSugarExtention { #region 同步 /// /// /// /// /// /// /// /// public static PageListModel GetPageResult(this ISugarQueryable query, PageInput page) where T : class, new() { int count = 0; #region 自定义排序 string orderSql = string.Empty; //设置排序方式 if (!string.IsNullOrWhiteSpace(page.SortFileId)) { query.QueryBuilder.OrderByValue = null;// 移除自定义排序 string[] fieldArr = page.SortFileId.ToLower().Split(','); string[] typeArr; if (string.IsNullOrWhiteSpace(page.SortType)) { typeArr = new string[fieldArr.Length]; for (int i = 0; i < typeArr.Length; i++) { typeArr[i] = "asc"; } } else { typeArr = page.SortType.ToLower().Split(","); } if (fieldArr.Length > 0 && fieldArr.Length <= 0) { foreach (var item in fieldArr) { orderSql += item + "asc,"; } } else { if (fieldArr.Length > 0 && fieldArr.Length != typeArr.Length) { throw new BizException("排序参数异常"); } for (int i = 0; i < fieldArr.Length; i++) { orderSql += fieldArr[i] + $"{typeArr[i]},"; } } } #endregion 自定义排序 #region 有排序 if (!string.IsNullOrWhiteSpace(orderSql)) { orderSql = orderSql.Trim(','); string sqlTemplate = "SELECT * FROM ({0}) ORDER BY {1}"; string sql = query.ToSql().Key; var paramLst = query.ToSql().Value; foreach (var item in paramLst) { if (item.Value == null) { continue; } if (item.DbType.ToString() == "DateTime") { DateTime dtime = (DateTime)item.Value; sql = sql.Replace(item.ParameterName, "'" + dtime.ToString("yyyy-MM-dd") + "'"); continue; } sql = sql.Replace(item.ParameterName, "'" + item.Value?.ToString() + "'"); } var orderLst = query.Context.SqlQueryable(string.Format(sqlTemplate, sql, orderSql)).ToPageList(page.PageIndex, page.PageRows, ref count); return new PageListModel() { PageList = orderLst, Total = count }; } #endregion 有排序 List lst = query.ToPageList(page.PageIndex, page.PageRows, ref count); return new PageListModel() { PageList = lst, Total = count }; } #endregion 同步 #region 异步 /// /// /// /// /// /// /// /// public static async Task> GetPageResultAsync(this ISugarQueryable query, PageInput page) where T : class, new() { RefAsync count = 0; #region 自定义排序 string orderSql = string.Empty; if (!string.IsNullOrWhiteSpace(page.SortFileId)) { query.QueryBuilder.OrderByValue = null;// 移除默认排序 string[] fieldArr = page.SortFileId.ToLower().Split(','); string[] typeArr; if (string.IsNullOrWhiteSpace(page.SortType)) { typeArr = new string[fieldArr.Length]; for (int i = 0; i < fieldArr.Length; i++) { typeArr[i] = "asc"; } } else { typeArr = page.SortType.ToLower().Split(","); } // 属性校验,保证返回实体存在当前字段 List fileds = typeof(T).GetProperties().Select(i => i.Name.ToLower()).ToList(); if (fieldArr.Length > 0 && typeArr.Length <= 0) { foreach (var item in fieldArr) { if (fileds.Contains(item)) { orderSql += item + "asc,"; } } } else { if (fieldArr.Length > 0 && fieldArr.Length != typeArr.Length) { throw new BizException("排序参数异常"); } for (int i = 0; i < fieldArr.Length; i++) { if (fileds.Contains(fieldArr[i])) { orderSql += fieldArr[i] + $"{typeArr[i]}"; } } } } #endregion 自定义排序 if (!string.IsNullOrWhiteSpace(orderSql)) { orderSql = orderSql.Trim(','); string sqlTemplate = "SELECT * FROM ({0}) ORDER BY {1}"; string sql = query.ToSql().Key; var parmLst = query.ToSql().Value; foreach (var item in parmLst) { if (item.Value == null) { continue; } if (item.DbType == System.Data.DbType.DateTime) { DateTime dtime = (DateTime)item.Value; sql = sql.Replace(item.ParameterName, "'" + dtime.ToString("yyyy-MM-dd") + "'"); continue; } else if (item.DbType == System.Data.DbType.String) { if (item.Value.ToString().Contains("'")) { throw new BizException($"参数值【{item.Value}】含有非法字符,无法查询!"); } } sql = sql.Replace(item.ParameterName, "'" + item.Value?.ToString() + "'"); } var orderLst = await query.Context.SqlQueryable(string.Format(sqlTemplate, sql, orderSql)).ToPageListAsync(page.PageIndex, page.PageRows, count); return new PageListModel() { PageList = orderLst, Total = count }; } List lst = await query.ToPageListAsync(page.PageIndex, page.PageRows, count); return new PageListModel() { PageList = lst, Total = count }; } #endregion 异步 #region 联合查询 /// /// /// /// /// /// /// public static ISugarQueryable Union(this ISugarQueryable queryable, params ISugarQueryable[] unionQueryables) { return queryable.Union(unionQueryables); } #endregion 联合查询 } }