c#按指定長度分解數組

在操作數據庫時,我們需要注意一點,就是in查詢的參數不能超過1000個,否則會報錯,所以我們在進行in查詢的時候需要對參數數量進行控制:

用於分解數組的擴展方法:

 /// <summary>
        /// 根據數量對數組進行分組(in查詢不能超過1000個條目)
        /// </summary>
        /// <param name="list"></param>
        /// <param name="size">數量</param>
        private List<List<long>> GroupListBySize(List<long> list,int size)
        {
            List<List<long>> listArr = new List<List<long>>();
            int arrSize = list.Count() % size == 0 ? list.Count() / size : list.Count() / size + 1;
            for (int i = 0; i < arrSize; i++)
            {
                List<long> sub = new List<long>();
                for (int j = i * size; j <= size * (i + 1) - 1; j++)
                {
                    if (j <= list.Count() - 1)
                    {
                        sub.Add(list[j]);
                    }
                }
                listArr.Add(sub);
            }
            return listArr;
        }  

如:數組長度爲2500,size(按照多少數量進行分割),這裏我們傳1000,則會被分解爲三個數組,長度分別爲,1000,1000,500;

 

業務層的方法接口:

        /// <summary>
        /// 根據id批量修改狀態
        /// </summary>
        /// <returns></returns>
        public bool ButchChangeState(List<long> ids, int state)
        {
            if (ids.Count > 0)
            {
                if (ids.Count()>1000)
                {
                    var lists = GroupListBySize(ids,1000);
                    foreach (var list in lists)
                    {
                        dal.ButchChangeState(list,state);
                    }
                }
                else
                {
                    dal.ButchChangeState(ids, state);
                }
                return true;
            }
            else { return false; }
        }

 

數據庫交互:

     /// <summary>
        /// 修改狀態////0:已執行,1:執行中,2:執行失敗,3:待下發
        /// </summary>
        /// <param name="ids"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public bool ButchChangeState(List<long> ids, int state)
        {

            if (ids.Count > 0)
            {
                string idStr = string.Join(",", ids);
                //List數組的每個元素加上引號,如("12","32","5456","876455")
                string idString = string.Format("'{0}'", idStr.Replace(",", "','"));
                string sql = $" update COMMAND_ACCESSLOG set WORKSTATE = {state},STRING1=:DOWNSENDTIME where COMMANDID in ( {idString} )";
                OracleParameter[] parameters =
                {
                    new OracleParameter(":DOWNSENDTIME",OracleDbType.Varchar2,1024)
                };
                parameters[0].Value = DateTime.Now.ToString();
                var row = DbHelperOra.ExecuteSql(sql,parameters);
                return row > 0 ? true : false;
            }
            else { return false; }

        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章