public UserInfoEntity[] FindUsers(UserInfoSearchCriteria userInfoSearchCriteria)
        {
            if (userInfoSearchCriteria == null) return new UserInfoEntity[] { };
            DataTable dt = new DataTable();
            DbHelper helper = new DbHelper();

            DbCommand command = helper.BuildDbCommand("P_IC_USER_INFO_SEARCH");

            var appName = NCS.IConnect.Security.ExtendedMembership.ApplicationName;
            helper.AssignParameterValues(
                command,
                SearchHelper.TranslateWildcard(userInfoSearchCriteria.UserName),
                SearchHelper.TranslateWildcard(userInfoSearchCriteria.UserStatus),
                userInfoSearchCriteria.CreatedFrom,
                userInfoSearchCriteria.CreatedTo,
                SearchHelper.TranslateWildcard(userInfoSearchCriteria.Display),
                SearchHelper.TranslateWildcard(userInfoSearchCriteria.Email),
                userInfoSearchCriteria.UserType,
                SearchHelper.TranslateWildcard(userInfoSearchCriteria.Office),
                appName
                );
            Helper.Fill(dt, command);

            Dictionary<string, UserInfoEntity> arrayList = new Dictionary<string, UserInfoEntity>();
            const string Yes = "Y";

            DataRow[] matchedRecords = dt.Select(string.Format("IS_MASTER='{0}'", Yes));

            //1. add the records that is the default office
            foreach (DataRow row in matchedRecords)
            {
                string userId = row["USER_ID"].ToString();
                //if (!(string.IsNullOrEmpty(userInfoSearchCriteria.Office)
                //    || SearchHelper.IsRegexMatch(row["DEFAULT_OFFICE"].ToString(), userInfoSearchCriteria.Office, @"\w|\W")))
                //{
                //    //Not match office criteria
                //    continue;
                //}
                if (arrayList.ContainsKey(userId))
                {
                    //Duplicated
                    continue;
                }
                arrayList.Add(userId, CreatEntity(row));
            }

            //2.Union the records that have no default office

            matchedRecords = dt.Select(string.Format("IS_MASTER<>'{0}'",Yes));

            foreach (DataRow row in matchedRecords)
            {
                string userId = row["USER_ID"].ToString();
                //if (!(string.IsNullOrEmpty(userInfoSearchCriteria.Office)
                //   || SearchHelper.IsRegexMatch(row[""].ToString(), userInfoSearchCriteria.Office, @"\w|\W")))
                //{
                //    //Not match office criteria
                //    continue;
                //}

                if (arrayList.ContainsKey(userId))
                {
                    //Duplicated or has default office records.
                    continue;
                }

                UserInfoEntity entity = CreatEntity(row);
            entity.Office = string.Empty;
                arrayList.Add(userId, entity);
            }

            //Compine all offices for every user
            foreach (KeyValuePair<string,UserInfoEntity> user in arrayList)
            {
                string userId = user.Key;
                matchedRecords = dt.Select(string.Format("USER_ID='{0}'", userId));
                StringBuilder allOffices = new StringBuilder();

                foreach (var row in matchedRecords)
                {
                    allOffices.Append(row["DEFAULT_OFFICE"].ToString());
                    allOffices.Append(",");
                }
                user.Value.AllOffices = allOffices.ToString().TrimEnd(',');
            }
            dt.Dispose();
            return arrayList.Values.ToArray<UserInfoEntity>();
        }
        private UserInfoSearchCriteria GetSearchCriteria()
        {
            UserInfoSearchCriteria userInfoSearchCriteria = new UserInfoSearchCriteria();
            userInfoSearchCriteria.UserName = this.txt_username.Text;
            if (this.cb_status.Value != null)
            {
                userInfoSearchCriteria.UserStatus = this.cb_status.Value.ToString();
            }
            else
            {
                // For exception handler
                userInfoSearchCriteria.UserStatus = String.Empty;
            }
            if (this.dt_createdfrom.Value != null)
            {
                userInfoSearchCriteria.CreatedFrom = this.dt_createdfrom.DateTime;
            }
            else
            {
                userInfoSearchCriteria.CreatedFrom = this.dt_createdfrom.MinDate;
            }
            if (this.dt_createdto.Value != null)
            {
                userInfoSearchCriteria.CreatedTo = this.dt_createdto.DateTime;
            }
            else
            {
                userInfoSearchCriteria.CreatedTo = this.dt_createdto.MaxDate;
            }
            userInfoSearchCriteria.Display = this.txt_display.Text;
            userInfoSearchCriteria.Email = this.txt_email.Text;

            userInfoSearchCriteria.UserType = (this.cb_userType.Value == DBNull.Value) ? null : (this.cb_userType.Value as bool?);

            userInfoSearchCriteria.Office = this.txt_office.Text;

            return userInfoSearchCriteria;
        }