.NET ORM框架HiSql實戰-第二章-使用Hisql實現菜單管理(增刪改查)

来源:https://www.cnblogs.com/pengxianyuan/archive/2022/07/04/16427137.html
-Advertisement-
Play Games

效果 概述 最近有個小需求要用雙滑塊表示一個取值範圍,於是就簡單做了個用戶控制項,在此記錄下. 使用矩形Rectangle表示範圍,橢圓Ellipse表示滑塊,使用Canvas控制滑塊的左右移動. 橢圓的滑鼠按下事件里強制獲取滑鼠事件焦點,避免移動過快或移出控制項範圍時,滑塊就不跟著跑了.橢圓的滑鼠抬起 ...


一、引言
上一篇.NET ORM框架HiSql實戰-第一章-集成HiSql 已經完成了Hisql的引入,本節就把 項目中的菜單管理改成hisql的方式實現。
菜單管理界面如圖:

二、修改增刪改查相關代碼
1、 在 BaseRepository 倉儲基類中添加 hisql訪問對象:HiSqlClient。這樣 所有繼承了BaseRepository的業務倉儲類都可以使用HiSqlClient操作資料庫。本節中的菜單管理用到的倉儲對象就是:SysMenuRepository

2、修改 SysMenuRepository類中訪問數據的代碼,將所有操作資料庫的地方使用HiSql方式實現。

3、查詢業務:獲取菜單詳情

/// <summary>
        /// 獲取菜單詳情
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public SysMenu SelectMenuById(int menuId)
        {
//hisql方式
            return ContextHiSql.HiSql(@"select * from sys_menu where menuId = @menuId ", new { menuId = menuId })
               .ToList<SysMenu>().FirstOrDefault();
//sqlsuar方式
            return Context.Queryable<SysMenu>().Where(it => it.menuId == menuId).Single();
        }

4、修改業務:編輯菜單

/// <summary>
        /// 編輯菜單
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public int EditMenu(SysMenu menu)
        {

            //hisql方式
            return ContextHiSql.Update("sys_menu", menu).ExecCommand();
            //sqlsugar方式
            return Context.Updateable(menu).ExecuteCommand();
        }

5、刪除業務:刪除菜單

/// <summary>
        /// 刪除菜單
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public int DeleteMenuById(long menuId)
        {  
            //hisql方式
            return ContextHiSql.Delete("sys_menu").Where(new Filter { { "menuId", OperType.EQ, menuId } }).ExecCommand();

            //sqlsugar方式
            return Context.Deleteable<SysMenu>().Where(it => it.menuId == menuId).ExecuteCommand();
        }

6、新增業務:添加菜單

/// <summary>
        /// 添加菜單
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public int AddMenu(SysMenu menu)
        {
            var Db = Context;
            menu.Create_time = Db.GetDate();
            
            menu.menuId = IDHelper.GetLongId(); 
            //hisql方式
            return ContextHiSql.Insert("sys_menu", menu).ExecCommand();

            //sqlsugar方式
            return Db.Insertable(menu).ExecuteCommand();
        }

Tip:此處使用雪花ID,其實HiSql自帶相關方法。如 HiSql.Snowflake.NextId(); 以及業務根據業務實際情況自定義編號的模塊,後面再集成到項目中來。 自定義編號

其他業務方法見 SysMenuRepository 代碼。

SysMenuRepository 代碼

using Infrastructure.Attribute;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using HSMB.Model.System.Dto;
using HSMB.Model.System;
using HiSql;
using Infrastructure;

namespace HSMB.Repository.System
{
    /// <summary>
    /// 系統菜單
    /// </summary>
    [AppService(ServiceLifetime = LifeTime.Transient)]
    public class SysMenuRepository : BaseRepository<SysMenu>
    {
        /// <summary>
        /// 獲取所有菜單(菜單管理)
        /// </summary>
        /// <returns></returns>
        public List<SysMenu> SelectMenuList(SysMenu menu)
        {
            //hisql方式
            Filter filters = new Filter();
            filters.AddIf(!string.IsNullOrEmpty(menu.menuName), "menuName", OperType.LIKE, menu.menuName);
            filters.AddIf(!string.IsNullOrEmpty(menu.visible), "visible", OperType.EQ, menu.visible);
            filters.AddIf(!string.IsNullOrEmpty(menu.menuName), "status", OperType.EQ, menu.status);
            return ContextHiSql.Query("sys_menu").Field("*").Where(filters).Sort("parentId", "orderNum").ToList<SysMenu>();

            //sqlsugar方式
            return Context.Queryable<SysMenu>()
                .WhereIF(!string.IsNullOrEmpty(menu.menuName), it => it.menuName.Contains(menu.menuName))
                .WhereIF(!string.IsNullOrEmpty(menu.visible), it => it.visible == menu.visible)
                .WhereIF(!string.IsNullOrEmpty(menu.status), it => it.status == menu.status)
                .OrderBy(it => new { it.parentId, it.orderNum })
                .ToList();
        }

        /// <summary>
        /// 根據用戶查詢系統菜單列表
        /// </summary>
        /// <param name="sysMenu"></param>
        /// <param name="userId">用戶id</param>
        /// <returns></returns>
        public List<SysMenu> SelectMenuListByUserId(SysMenu sysMenu, long userId)
        {
            //hisql方式
            Filter filters = new Filter();
            filters.Add("userRole.UserId", OperType.EQ, userId);
            filters.AddIf(!string.IsNullOrEmpty(sysMenu.menuName), "menu.menuName", OperType.LIKE, sysMenu.menuName);
            filters.AddIf(!string.IsNullOrEmpty(sysMenu.visible), "menu.visible", OperType.EQ, sysMenu.visible);
            filters.AddIf(!string.IsNullOrEmpty(sysMenu.menuName), "menu.status", OperType.EQ, sysMenu.status);

            return ContextHiSql.HiSql(@"select menu.* from sys_menu as  menu 
                    join sys_role_menu as roleMenu on menu.menuId = roleMenu.menuId 
                    join sys_user_role as userRole on userRole.Role_id = roleMenu.Role_id
                    join sys_role as role on role.RoleId = userRole.RoleId
                 order by menu.parentId, menu.orderNum
                ").Where(filters).ToList<SysMenu>(); //
            //sqlsugar方式
            return Context.Queryable<SysMenu, SysRoleMenu, SysUserRole, SysRole>((menu, roleMenu, userRole, role) => new JoinQueryInfos(
                 SqlSugar.JoinType.Left, menu.menuId == roleMenu.Menu_id,
                 SqlSugar.JoinType.Left, roleMenu.Role_id == userRole.RoleId,
                 SqlSugar.JoinType.Left, userRole.RoleId == role.RoleId
                 ))
                .Where((menu, roleMenu, userRole, role) => userRole.UserId == userId)
                .WhereIF(!string.IsNullOrEmpty(sysMenu.menuName), (menu, roleMenu, userRole, role) => menu.menuName.Contains(sysMenu.menuName))
                .WhereIF(!string.IsNullOrEmpty(sysMenu.visible), (menu, roleMenu, userRole, role) => menu.visible == sysMenu.visible)
                .WhereIF(!string.IsNullOrEmpty(sysMenu.status), (menu, roleMenu, userRole, role) => menu.status == sysMenu.status)
                .OrderBy((menu, roleMenu, userRole, role) => new { menu.parentId, menu.orderNum })
                .Select((menu, roleMenu, userRole, role) => menu).ToList();
        }

        #region 左側菜單樹

        /// <summary>
        /// 管理員獲取左側菜單樹
        /// </summary>
        /// <returns></returns>
        public List<SysMenu> SelectMenuTreeAll()
        {
            var menuTypes = new string[] { "M", "C" };
            //hisql方式
            return ContextHiSql.HiSql("select * from sys_menu where status = @status and menuType in(@menuType)", new { status = "0", menuType = menuTypes })
                .Sort("parentId", "orderNum")
                .ToList<SysMenu>();
            //sqlsugar方式
            return Context.Queryable<SysMenu>()
                .Where(f => f.status == "0" && menuTypes.Contains(f.menuType))
                .OrderBy(it => new { it.parentId, it.orderNum }).ToList();
        }

        /// <summary>
        /// 根據用戶角色獲取左側菜單樹
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public List<SysMenu> SelectMenuTreeByRoleIds(List<long> roleIds)
        {
            var menuTypes = new List<string>() { "M", "C"};
            //hisql方式
            return ContextHiSql.HiSql(@"select menu.* from sys_menu as menu join  sys_role_menu as roleMenu on  menu.menuId = roleMenu.Menu_id
                    where roleMenu.Role_id in (@roleIds) and menu.menuType in(@menuType)", new { roleIds = (List<long>)roleIds, menuType = menuTypes })
                .Sort("parentId", "orderNum")
                .ToList<SysMenu>();
            //sqlsugar方式
            return Context.Queryable<SysMenu, SysRoleMenu>((menu, roleMenu) => new JoinQueryInfos(
                 SqlSugar.JoinType.Left, menu.menuId == roleMenu.Menu_id
                 ))
                .Where((menu, roleMenu) => roleIds.Contains(((int)roleMenu.Role_id)) && menuTypes.Contains(menu.menuType) && menu.status == "0")
                .OrderBy((menu, roleMenu) => new { menu.parentId, menu.orderNum })
                .Select((menu, roleMenu) => menu).ToList();
        }

        #endregion

        /// <summary>
        /// 獲取菜單詳情
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public SysMenu SelectMenuById(int menuId)
        { 
            //hisql方式
            return ContextHiSql.HiSql(@"select * from sys_menu where menuId = @menuId ", new { menuId = menuId })
               .ToList<SysMenu>().FirstOrDefault();
            //sqlsugar方式
            return Context.Queryable<SysMenu>().Where(it => it.menuId == menuId).Single();
        }

        /// <summary>
        /// 添加菜單
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public int AddMenu(SysMenu menu)
        {
            var Db = Context;
            menu.Create_time = Db.GetDate();
            
            menu.menuId = IDHelper.GetLongId(); // 此處使用雪花ID,其實HiSql自帶相關方法。如 HiSql.Snowflake.NextId();
            //hisql方式
            return ContextHiSql.Insert("sys_menu", menu).ExecCommand();

            //sqlsugar方式
            return Db.Insertable(menu).ExecuteCommand();
        }

        /// <summary>
        /// 編輯菜單
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public int EditMenu(SysMenu menu)
        {

            //hisql方式
            return ContextHiSql.Update("sys_menu", menu).ExecCommand();
            //sqlsugar方式
            return Context.Updateable(menu).ExecuteCommand();
        }

        /// <summary>
        /// 刪除菜單
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public int DeleteMenuById(long menuId)
        {  
            //hisql方式
            return ContextHiSql.Delete("sys_menu").Where(new Filter { { "menuId", OperType.EQ, menuId } }).ExecCommand();

            //sqlsugar方式
            return Context.Deleteable<SysMenu>().Where(it => it.menuId == menuId).ExecuteCommand();
        }

        /// <summary>
        /// 菜單排序
        /// </summary>
        /// <param name="menuDto">菜單Dto</param>
        /// <returns></returns>
        public int ChangeSortMenu(MenuDto menuDto)
        {

            //hisql方式
            return  ContextHiSql.Update("sys_menu", new SysMenu() { menuId = menuDto.MenuId, orderNum = menuDto.orderNum }).Only("orderNum").ExecCommand();
            
            //sqlsugar方式
            var result = Context.Updateable(new SysMenu() { menuId = menuDto.MenuId, orderNum = menuDto.orderNum })
                .UpdateColumns(it => new { it.orderNum }).ExecuteCommand();
            return result;
        }

        /// <summary>
        /// 查詢菜單許可權
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public List<SysMenu> SelectMenuPermsByUserId(long userId)
        {
            //var ta =  ContextHiSql.Query("sys_role").Field("*").ToList<SysMenu>().FirstOrDefault();

            //hisql方式
            Filter filters = new Filter();
            filters.Add("menu.status", OperType.EQ, 0);
            filters.Add("role.status", OperType.EQ, 0);
            filters.Add("userRole.user_id", OperType.EQ, userId);

            string aa = @"select menu.* from sys_menu as  menu 
                    join sys_role_menu as roleMenu on menu.menuId = roleMenu.menu_id 
                    join sys_user_role as userRole on userRole.Role_id = roleMenu.Role_id
                    join sys_role as role on role.RoleId = userRole.role_id
                 order by menu.parentId, menu.orderNum
                ";
            return ContextHiSql.HiSql(@"select menu.* from sys_menu as  menu 
                    join sys_role_menu as roleMenu on menu.menuId = roleMenu.menu_id 
                    join sys_user_role as userRole on userRole.Role_id = roleMenu.Role_id
                    join sys_role as role on role.RoleId = userRole.role_id
                 order by menu.parentId, menu.orderNum
                ").Where(filters).ToList<SysMenu>(); //

            //sqlsugar方式
            return Context.Queryable<SysMenu, SysRoleMenu, SysUserRole, SysRole>((m, rm, ur, r) => new JoinQueryInfos(
                SqlSugar.JoinType.Left, m.menuId == rm.Menu_id,
                SqlSugar.JoinType.Left, rm.Role_id == ur.RoleId,
                SqlSugar.JoinType.Left, ur.RoleId == r.RoleId
                ))
                //.Distinct()
                .Where((m, rm, ur, r) => m.status == "0" && r.Status == "0" && ur.UserId == userId)
                .Select((m, rm, ur, r) => m).ToList();
        }

        /// <summary>
        /// 校驗菜單名稱是否唯一
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public SysMenu CheckMenuNameUnique(SysMenu menu)
        {
            //hisql方式
            Filter filters = new Filter();
            filters.Add("menuName", OperType.EQ, menu.menuName);
            filters.Add("parentId", OperType.EQ, menu.parentId);
            return ContextHiSql.Query("sys_menu").Field("*").Where(filters).ToList<SysMenu>().FirstOrDefault();
            //sqlsugar方式
            return Context.Queryable<SysMenu>()
                .Where(it => it.menuName == menu.menuName && it.parentId == menu.parentId).Single();
        }

        /// <summary>
        /// 是否存在菜單子節點
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public int HasChildByMenuId(long menuId)
        {
            //hisql方式
            Filter filters = new Filter();
            filters.Add("parentId", OperType.EQ, menuId);
            return int.Parse(ContextHiSql.Query("sys_menu").Field("count(*) as Cnt").Where(filters).ToTable().Rows[0][0].ToString());

            //sqlsugar方式
            return Context.Queryable<SysMenu>().Where(it => it.parentId == menuId).Count();
        }

        #region RoleMenu

        /// <summary>
        /// 查詢菜單使用數量
        /// </summary>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public int CheckMenuExistRole(long menuId)
        {
            //hisql方式
            Filter filters = new Filter();
            filters.Add("Menu_id", OperType.EQ, menuId);
            return int.Parse(ContextHiSql.Query("sys_role_menu").Field("count(*) as Cnt").Where(filters).ToTable().Rows[0][0].ToString());

            //sqlsugar方式
            return Context.Queryable<SysRoleMenu>().Where(it => it.Menu_id == menuId).Count();
        }

        #endregion
    }
}


倉儲基類 BaseRepository.cs 代碼

using H.Cache;
using Infrastructure;
using Infrastructure.Extensions;
using Infrastructure.Model;
using SqlSugar;
using SqlSugar.IOC;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using HSMB.Model;
using HSMB.Model.System;
using HiSql;

namespace HSMB.Repository
{
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BaseRepository<T> : IBaseRepository<T> where T : class, new()
    {
        public ISqlSugarClient Context;

        public HiSqlClient ContextHiSql;

        public ICacheManagerBase cacheManager;
        public BaseRepository( string configId = "0")
        {
            this.cacheManager = AutofacCore.GetFromFac<ICacheManagerBase>();

            //hisql方式
            this.ContextHiSql = AutofacCore.GetFromFac<HiSqlClient>();
           
            //sqlsugar 方式
            Context = DbTransient.Sugar.GetConnection(configId);//根據類傳入的ConfigId自動選擇   Context = DbScoped.SqlSugarScope.GetConnection(configId);  
        }

        #region add
        /// <summary>
        /// 插入指定列使用
        /// </summary>
        /// <param name="parm"></param>
        /// <param name="iClumns"></param>
        /// <param name="ignoreNull"></param>
        /// <returns></returns>
        public int Add(T parm, Expression<Func<T, object>> iClumns = null, bool ignoreNull = true)
        {
            return Context.Insertable(parm).InsertColumns(iClumns).IgnoreColumns(ignoreNullColumn: ignoreNull).ExecuteCommand();
        }
        /// <summary>
        /// 插入實體
        /// </summary>
        /// <param name="t"></param>
        /// <param name="IgnoreNullColumn">預設忽略null列</param>
        /// <returns></returns>
        public int Add(T t)
        {
            return Context.Insertable(t).ExecuteCommand();
        }

        public int Insert(List<T> t)
        {
            return Context.Insertable(t).ExecuteCommand();
        }
        public long InsertReturnBigIdentity(T t)
        {
            return Context.Insertable(t).ExecuteReturnBigIdentity();
        }

        

        #endregion add

        #region update
        
        /// <summary>
        ///
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="list"></param>
        /// <param name="isNull">預設為true</param>
        /// <returns></returns>
        public bool Update(T entity, List<string> list = null, bool isNull = true)
        {
            if (list == null)
            {
                list = new List<string>()
            {
                "Create_By",
                "Create_time"
            };
            }
            return Context.Updateable(entity).IgnoreColumns(isNull).IgnoreColumns(list.ToArray()).ExecuteCommand() > 0;
        }

        public bool Update(Expression<Func<T, bool>> where, Expression<Func<T, T>> columns)
        {
            return Context.Updateable<T>().SetColumns(columns).Where(where).RemoveDataCache().ExecuteCommand() > 0;
        }
        #endregion update



        public DbResult<bool> UseTran(Action action)
        {
            var result = Context.Ado.UseTran(() => action());
            return result;
        }

        public DbResult<bool> UseTran(SqlSugarClient client, Action action)
        {
            var result = client.Ado.UseTran(() => action());
            return result;
        }

        public bool UseTran2(Action action)
        {
            var result = Context.Ado.UseTran(() => action());
            return result.IsSuccess;
        }

        #region delete

        /// <summary>
        /// 刪除表達式
        /// </summary>
        /// <param name="expression"></param>
        /// <returns></returns>
        public int Delete(Expression<Func<T, bool>> expression)
        {
            return Context.Deleteable<T>().Where(expression).ExecuteCommand();
        }

        /// <summary>
        /// 批量刪除
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public int Delete(object[] obj)
        {
            return Context.Deleteable<T>().In(obj).ExecuteCommand();
        }
        public int Delete(object id)
        {
            return Context.Deleteable<T>(id).ExecuteCommand();
        }
        public bool DeleteTable()
        {
            return Context.Deleteable<T>().ExecuteCommand() > 0;
        }

        #endregion delete

        #region query

        public bool Any(Expression<Func<T, bool>> expression)
        {
            return Context.Queryable<T>().Where(expression).Any();
        }

        public ISugarQueryable<T> Queryable()
        {
            return Context.Queryable<T>();
        }

        public List<T> GetList(Expression<Func<T, bool>> expression)
        {
            return Context.Queryable<T>().Where(expression).ToList();
        }

        public Task<List<T>> GetListAsync(Expression<Func<T, bool>> expression)
        {
            return Context.Queryable<T>().Where(expression).ToListAsync();
        }

       
        public List<T> SqlQueryToList(string sql, object obj = null)
        {
            return Context.Ado.SqlQuery<T>(sql, obj);
        }
        /// <summary>
        /// 獲得一條數據
        /// </summary>
        /// <param name="where">Expression<Func<T, bool>></param>
        /// <returns></returns>
        public T GetFirst(Expression<Func<T, bool>> where)
        {
            return Context.Queryable<T>().Where(where).First();
        }

        /// <summary>
        /// 根據主值查詢單條數據
        /// </summary>
        /// <param name="pkValue">主鍵值</param>
        /// <returns>泛型實體</returns>
        public T GetId(object pkValue)
        {
            return Context.Queryable<T>().InSingle(pkValue);
        }
        /// <summary>
        /// 根據條件查詢分頁數據
        /// </summary>
        /// <param name="where"></param>
        /// <param name="parm"></param>
        /// <returns></returns>
        public PagedInfo<T> GetPages(Expression<Func<T, bool>> where, PagerInfo parm)
        {
            var source = Context.Queryable<T>().Where(where);

            return source.ToPage(parm);
        }

        public PagedInfo<T> GetPages(Expression<Func<T, bool>> where, PagerInfo parm, Expression<Func<T, object>> order, string orderEnum = "Asc")
        {
            var source = Context.Queryable<T>().Where(where).OrderByIF(orderEnum == "Asc", order, OrderByType.Asc).OrderByIF(orderEnum == "Desc", order, OrderByType.Desc);

            return source.ToPage(parm);
        }
        /// <summary>
        /// 查詢所有數據(無分頁,請慎用)
        /// </summary>
        /// <returns></returns>
        public virtual List<T> GetAll(bool useCache = false, int cacheSecond = 3600)
        {
            if (useCache)
            {
                var cacheData = this.cacheManager.Get<List<T>>(typeof(T).FullName, (ct) => {
                    var data = Context.Queryable<T>().ToList();
                    return data;
                }, TimeSpan.FromSeconds(cacheSecond));
                if (typeof(SysUser).FullName == typeof(T).FullName)
                {
                   
                }
                return cacheData;
            }
            return Context.Queryable<T>().WithCacheIF(useCache, cacheSecond).ToList();
        }

        public int Count(Expression<Func<T, bool>> where)
        {
            return Context.Queryable<T>().Count(where);
        }
        #endregion query

        /// <summary>
        /// 此方法不帶output返回值
        /// var list = new List<SugarParameter>();
        /// list.Add(new SugarParameter(ParaName, ParaValue)); input
        /// </summary>
        /// <param name="procedureName"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public DataTable UseStoredProcedureToDataTable(string procedureName, List<SugarParameter> parameters)
        {
            return Context.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters);
        }
        public DataSet UseStoredProcedureToDataSet(string procedureName, List<SugarParameter> parameters)
        {

            var dataResult = new DataSet();
            string sql = $"exec {procedureName} ";
            
            foreach (var key in parameters)
            {
                if (!key.Value.IsEmpty())
                {
                    sql = sql + (sql.IndexOf("@") > -1 ? ", " : " ") + $" {key.ParameterName} = {key.ParameterName}";
                }
            }

            return Context.Ado.GetDataSetAll(sql, parameters);
            return Context.Ado.UseStoredProcedure().GetDataSetAll(procedureName, parameters);
        }

        public int ExecSql(string sql)
        {
            return Context.Ado.ExecuteCommand(sql,new List<SugarParameter>());
        }

        /// <summary>
        /// 帶output返回值
        /// var list = new List<SugarParameter>();
        /// list.Add(new SugarParameter(ParaName, ParaValue, true));  output
        /// list.Add(new SugarParameter(ParaName, ParaValue)); input
        /// </summary>
        /// <param name="procedureName"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public (DataTable, List<SugarParameter>) UseStoredProcedureToTuple(string procedureName, List<SugarParameter> parameters)
        {
            var result = (Context.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters), parameters);
            return result;
        }
        
        public DataTable QueryableToDataTable(PagerInfo pager)
        {
            int TotalPageNum = 0;
            int TotalNum = 0;
            List<SugarParameter> parameters = new List<SugarParameter>();

            string sqlWhere = buildSearchFilter(pager, out parameters);
            var query = Context.SqlQueryable<object>($"select * from {pager.TableName}").Where(sqlWhere).AddParameters(parameters);
            if (pager.OrderBy.IsNotEmpty())
            {
                query = query.OrderBy(pager.OrderBy);
            }
            var table = query.ToDataTablePage(pager.PageNum, pager.PageSize, ref TotalPageNum, ref TotalNum);

            pager.TotalPageNum = TotalPageNum;
            pager.TotalNum = TotalNum;
            return table;
        }
        public PagedInfo QueryableToDataTablePage(PagerInfo pager)
        {
            var table = QueryableToDataTable(pager);
            PagedInfo pagedInfo = new PagedInfo();
            pagedInfo.PageIndex = pager.PageNum;
            pagedInfo.PageSize = pager.PageSize;
            pagedInfo.TotalPage = pager.TotalNum;
            pagedInfo.TotalCount = pager.TotalPageNum;
            pagedInfo.Result = table;  // Enumerable.ToList< DataRow >(table);
            return pagedInfo;
        }

        

        private string buildSearchFilter(PagerInfo pager, out List<SugarParameter> parameters)
        {
            parameters = new List<SugarParameter>();
            if (pager.QueryConditions == null || pager.QueryConditions.Count() == 0)
            {
                return pager.Where;
            }
            StringBuilder sqlWhere = new StringBuilder(pager.QueryConditions.Count() + 1);
            sqlWhere.Append(" 1 = 1 ");
         
            int i = 0;
            foreach (PageQueryCondition pageQuery in pager.QueryConditions)
            {
                i++;
                string field = pageQuery.FieldName;
                var _value = pageQuery.Values;

                string startValue = null;
                if (_value != null)
                {
                    startValue = _value.ElementAtOrDefault(0);
                }
                if(startValue == null)
                    continue;

                if (string.IsNullOrEmpty(startValue) && (pageQuery.Mode != QueryConditionMode.Equal && pageQuery.Mode != QueryConditionMode.NotEqual && pageQuery.Mode != QueryConditionMode.Between && pageQuery.Mode != QueryConditionMode.BetweenAndDate))
                    continue;
                if (!string.IsNullOrEmpty(startValue))
                {
                    startValue = startValue.Replace("'", "''");
                }
                switch (pageQuery.Mode)
                {
                    case QueryConditionMode.In:
                        {
                            for (int q  = 0; q < _value.Count; q++)
                            {
                                _value[q] = _value[q].Replace("'", "''");
                            }
                          
                            sqlWhere.Append(string.Format(" and [{0}] in ('"+ string.Join("','", _value) + "')", field, field + i.ToString()));
                            break;
                        }
                    case QueryConditionMode.Equal:
                        {
                            if (startValue == null)
                            {
                                sqlWhere.Append(string.Format(" and [{0}] is null", field));
                                break;
                            }
                            else
                            {
                                sqlWhere.Append(string.Format(" and [{0}]=@{1}", field, field + i.ToString()));
                                parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                                break;
                            }

                        }
                    case QueryConditionMode.NotEqual:
                        {
                            if (startValue == null)
                            {
                                sqlWhere.Append(string.Format(" and [{0}] is not null", field));
                                break;
                            }
                            else
                            {

                                sqlWhere.Append(string.Format(" and [{0}] <> @{1}", field, field + i.ToString()));
                                parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                                break;
                            }
                        }
                    case QueryConditionMode.Greater:
                        {
                            sqlWhere.Append(string.Format(" and [{0}]>@{1}", field, field + i.ToString()));
                            parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                            break;
                        }
                    case QueryConditionMode.GreaterEqual:
                        {
                            sqlWhere.Append(string.Format(" and [{0}]>=@{1}", field, field + i.ToString()));
                            parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                            break;
                        }
                    case QueryConditionMode.Less:
                        {
                            sqlWhere.Append(string.Format(" and [{0}]<@{1}", field, field + i.ToString()));
                            parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                            break;
                        }
                    case QueryConditionMode.LessEqual:
                        {
                            sqlWhere.Append(string.Format(" and [{0}]<=@{1}", field, field + i.ToString()));
                            parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                            break;
                        }
                    case QueryConditionMode.Like:
                        {
                            sqlWhere.Append(string.Format(" and CHARINDEX(@{1},[{0}])>0 ", field, field + i.ToString()));
                            parameters.Add(new SugarParameter(field + i.ToString(), startValue));
                            break;
                        }
                    case QueryConditionMode.Between:
                        {
                            var endValue = pageQuery.Values.ElementAtOrDefault(1);
                            if (string.IsNullOrEmpty(startValue) && string.IsNullOrEmpty(endValue)) break;
                            endValue = endValue.Replace("'", "''");
                            dataType(startValue, endValue);
                            sqlWhere.Append(string.Format(" and ([{0}] between @{1}1 and @{2}2) ", field, field + i.ToString(), field + i.ToString()));
                            parameters.Add(new SugarParameter(string.Format("@{0}1", field + i.ToString()), startValue));
                            parameters.Add(new SugarParameter(string.Format("@{0}2", field + i.ToString()), endValue));

                            break;
                        }
                    case QueryConditionMode.BetweenAndDate:
                        {
                            var endValue = pageQuery.Values.ElementAtOrDefault(1);
                            if (endValue == null)
                                endValue = "";
                            if (!startValue.IsEmpty() && startValue.IndexOf(" - ") > -1)
                            {
                                string splitStr = " - ";
                                string _startValue = startValue;
                                startValue = _startValue.Substring(0, _startValue.IndexOf(splitStr));
                                endValue = _startValue.Substring(_startValue.IndexOf(splitStr) + splitStr.Length);
                            }
                            if (string.IsNullOrEmpty(startValue) && string.IsNullOrEmpty(endValue)) break;
                            endValue = endValue.Replace("'", "''");

                            DateTime outDateTime;
                            if (DateTime.TryParse(startValue, out outDateTime))
                            {
                                startValue = outDateTime.ToString("yyyy-MM-dd 00:00:00");
                            }
                            else
                            {
                                startValue = "1900-01-01 00:00:00";
                            }
                            if (DateTime.TryParse(endValue, out outDateTime))
                            {
                                endValue = outDateTime.ToString("yyyy-MM-dd 23:59:59");
                            }
                            else
                            {
                                endValue = "2099-01-01 23:59:59";
                            }
                            sqlWhere.Append(string.Format(" and ([{0}] between @{1}1 and @{2}2) ", field, field + i.ToString(), field + i.ToString()));
                            parameters.Add(new SugarParameter(string.Format("@{0}1", field + i.ToString()), startValue));
                            parameters.Add(new SugarParameter(string.Format("@{0}2", field + i.ToString()), endValue));
                            break;
                        }
                }
            }
            return pager.Where.IsEmpty()? sqlWhere.ToString():pager.Where+ " and "+ sqlWhere.ToString();
        }
        /// <summary>
        /// 判斷值的數據類型
        /// </summary>
        /// <returns></returns>
        private void dataType(string startValue, string endValue)
        {
            DateTime outDateTime;
            if (DateTime.TryParse(startValue, out outDateTime) || DateTime.TryParse(endValue, out outDateTime))
            {
                startValue = string.IsNullOrEmpty(startValue) ? "1900-01-01 00:00:00" : startValue;
                endValue = string.IsNullOrEmpty(startValue) ? "2050-01-01 23:59:59" : startValue;
            }
            double outi = 0;
            if (double.TryParse(startValue, out outi) || double.TryParse(endValue, out outi))
            {
                startValue = string.IsNullOrEmpty(startValue) ? int.MinValue.ToString() : startValue;
                endValue = string.IsNullOrEmpty(startValue) ? int.MinValue.ToString() : startValue;
            }
        }
    }

    public static class QueryableExtension
    {
        /// <summary>
        /// 讀取列表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <param name="parm"></param>
        /// <returns></returns>
        public static PagedInfo<T> ToPage<T>(this ISugarQueryable<T> source, PagerInfo parm)
        {
            var page = new PagedInfo<T>();
            var total = source.Count();
            page.TotalCount = total;
            page.PageSize = parm.PageSize;
            page.PageIndex = parm.PageNum;
            page.Result = source.ToPageList(parm.PageNum, parm.PageSize);
            return page;
        }
        public static PagedInfo<DataTable> ToPageDataTable<T>(this ISugarQueryable<T> source, PagerInfo parm)
        {
            var page = new PagedInfo<DataTable>();
            var total = source.Count();
            page.TotalCount = total;
            page.PageSize = parm.PageSize;
            page.PageIndex = parm.PageNum;
            page.DataTable = source.ToDataTablePage(parm.PageNum, parm.PageSize);
            return page;
        }
    }
}

到此,菜單管理模塊通過hisql完成了 菜單的新增、編輯、刪除、查看詳情。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python3中,讀取文件有三種方法:read()、readline()、readlines()。 此三種方法,均支持接收一個變數,用於限制每次讀取的數據量,但是,通常不會使用。 本文的目的:分析、總結上述三種讀取方式的使用方法及特點。 一、read方法 特點:讀取整個文件,將文件內容放到一個字元串 ...
  • 六月,秋秋發生大規模盜號事件,眾說紛紜,也有說因為某習通買賣個人信息導致的,有說是因為點了圖片中的網站導致中毒被盜的,還有說企鵝資料庫被攻擊導致賬號被盜的,反正公說公有理婆說婆有理。 但是吧,人吶,一般都喜歡湊熱鬧,於是乎,我直接用Python把圍脖爬了一遍,看他們爭論的不亦樂乎,我開心極了~ 兄弟 ...
  • #雜談 #Java腳本 因本人英語不好在使用Obsidian時,一些插件的設置英文多令人頭痛。故有寫一個的翻譯插件介紹和設置腳本的想法。看到有些前人寫的一下翻譯方法,簡直慘目忍睹。竟然要手動。這個應該寫好到只需要一鍵就可以漢化的地步嗎? 好吧。我承認這有些難度。翻譯引擎就用有道的吧。我覺得它對專業名 ...
  • 前言 就國內來說,Java毫無疑問是後端語言中的No.1沒有之一,所以今天我們也來0基礎學習Java!!! Java的好處(針對測試工程師) 面試加分->漲薪 大多數公司服務端用的都是Java,學習之後能看懂後臺邏輯,方便快速定位問題 在如此**捲**的環境下,不得不去跟著一起捲(躺平不香嗎?學什麼 ...
  • 發佈一個用於測試 Webservice 和資料庫連接的工具。 ...
  • 來源:blog.csdn.net/dabusiGin/article/details/105483426 錯誤的結論 在網上搜索HashMap中變數modCount的作用時,大部分的解釋都是這樣: Fail-Fast 機制 我們知道 java.util.HashMap 不是線程安全的,因此如果在使用 ...
  • 使用背景: 項目中需要用的富文本框去上傳視頻,圖片的話大部分都是可以的。相對來說,國外的富文本框很成熟。但鑒於文檔是英語,這裡使用了百度的富文本框。 採用的api的方式,調用介面進行上傳文件。話不多說,開擼! 準備: 創建一個.net mvc的項目。下載百度富文本框.net 版本的js文件。 創建項 ...
  • 一:背景 1. 講故事 前幾天有位朋友在 B站 加到我,說他的程式出現了 線程數 爆高的問題,讓我幫忙看一下怎麼回事,截圖如下: 說來也奇怪,這些天碰到了好幾起關於線程數無緣無故的爆高,不過那幾個問題比這一篇要複雜的多,主要涉及到非托管層面,分享這一篇的目的主要是它很有代表性,很有必要。 閑話不多說 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...