/// <summary> /// Constructor /// </summary> /// <param name="dmParent"></param> /// <param name="tableName"></param> /// <param name="defaultOrder"></param> /// <param name="groupByClause"></param> /// <param name="selectClause"></param> public SearchManagerGroupByDetail(IDisplayManager dmParent, string tableName, string defaultOrder, string selectClause, string groupByClause) : base(dmParent) { m_parentSm = dmParent.SearchManager as SearchManager; if (m_parentSm == null) { SearchManagerGroupByDetail se = dmParent.SearchManager as SearchManagerGroupByDetail; if (se == null) { throw new ArgumentException("SearchManagerGroupByDetail's Parent SearchManager must be Feng.Data.SearchManager or SearchManagerGroupByDetail!", "se"); } m_parentSm = se.m_innerSearchManager; } if (string.IsNullOrEmpty(m_parentSm.GroupBySql)) { throw new ArgumentException("SearchManagerGroupByDetail's Parent SearchManager must has groupby sub clause!", "GroupBySql"); } string s = m_parentSm.GroupBySql.ToUpper().Replace("GROUP BY", ""); m_groupByColumns = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < m_groupByColumns.Length; ++i) { m_groupByColumns[i] = m_groupByColumns[i].Trim(); } m_innerSearchManager = new SearchManager(tableName, defaultOrder, selectClause, groupByClause); m_innerSearchManager.Name = this.Name + ".Inner"; m_tableName = tableName; m_defaultOrder = defaultOrder; m_selectClause = selectClause; m_groupByClause = groupByClause; m_innerSearchManager.EnablePage = false; }
/// <summary> /// /// </summary> /// <param name="searchExpression"></param> /// <returns></returns> public virtual DbCommand CreateCountDbCommand(ISearchExpression searchExpression) { DbCommand cmd = DbHelper.Instance.Database.DbProviderFactory.CreateCommand(); cmd.CommandType = System.Data.CommandType.Text; if (searchExpression is QueryExpression) { string str = (searchExpression as QueryExpression).Query; str = str.ToUpper(); int idx = str.IndexOf("' '"); int idx2 = str.IndexOf("FROM"); str = str.Replace(str.Substring(idx, idx2 - idx), " COUNT(*) "); cmd.CommandText = str; } else { int paramCnt = 0; // Add Where if (searchExpression != null) { string s = SearchManager.FillDbCommand(searchExpression, cmd.Parameters, false, ref paramCnt, m_selectAsColumns); if (!string.IsNullOrEmpty(s)) { cmd.CommandText += " WHERE " + s; } } string groupBy = SearchManager.GetGroupCommand(m_groupBySql); if (!string.IsNullOrEmpty(groupBy)) { cmd.CommandText += groupBy; // Add Having if (searchExpression != null) { string s = SearchManager.FillDbCommand(searchExpression, cmd.Parameters, true, ref paramCnt, m_selectAsColumns); if (!string.IsNullOrEmpty(s)) { cmd.CommandText += " HAVING " + s; } } } if (paramCnt > 2100) { throw new NotSupportedException("您输入的参数过多,系统最多只支持2100个参数!"); } } return(cmd); }
//private void ProcessCmd(DbCommand cmd) //{ // foreach (string s in m_funcParams) // { // if (!cmd.Parameters.Contains(s)) // { // cmd.CommandText = cmd.CommandText.Replace(s, "default"); // } // else // { // // remove like % // string likeString = cmd.Parameters[s].Value as string; // if (!string.IsNullOrEmpty(likeString)) // { // if (likeString[0] == '%' && likeString[likeString.Length - 1] == '%') // { // cmd.Parameters[s].Value = likeString.Substring(1, likeString.Length - 2); // } // } // // remove where clause // int idx = cmd.CommandText.IndexOf("WHERE"); // idx = cmd.CommandText.IndexOf(s, idx); // int idx2 = idx; // // jump to "=, >=" // idx2--; // while (cmd.CommandText[idx2] == ' ') // idx2--; // // jump to space // idx2--; // while (cmd.CommandText[idx2] != ' ') // idx2--; // // jump to propertyName // idx2--; // while (cmd.CommandText[idx2] == ' ') // idx2--; // // jump to space // idx2--; // while (cmd.CommandText[idx2] != ' ') // idx2--; // cmd.CommandText = cmd.CommandText.Replace(cmd.CommandText.Substring(idx2 + 1, idx - idx2 - 1 + s.Length), "1 = 1"); // } // } //} private ISearchExpression RemoveFunctionParamSearchExpression(ISearchExpression se, Dictionary <string, object> deletedParam) { if (se == null) { return(null); } if (se is LogicalExpression) { LogicalExpression le = se as LogicalExpression; ISearchExpression ls = RemoveFunctionParamSearchExpression(le.LeftHandSide, deletedParam); ISearchExpression rs = RemoveFunctionParamSearchExpression(le.RightHandSide, deletedParam); switch (le.LogicOperator) { case LogicalOperator.And: return(SearchExpression.And(ls, rs)); case LogicalOperator.Or: return(SearchExpression.Or(ls, rs)); case LogicalOperator.Not: return(SearchExpression.Not(ls)); default: throw new NotSupportedException("Not Supported LogicalOperator!"); } } else if (se is SimpleExpression) { SimpleExpression cse = se as SimpleExpression; string paramName = SearchManager.CreateParamName(cse, null); if (Array.IndexOf(m_funcParams, paramName) != -1) { deletedParam[paramName] = cse.Values; return(null); } else { return(cse); } } else { return(se); } }
private void ParseQueryString(string queryString) { m_queryString = queryString.ToUpper(); int idx = m_queryString.IndexOf("GROUP BY"); if (idx != -1) { m_selectSql = m_queryString.Substring(0, idx); m_groupBySql = m_queryString.Substring(idx); int idx2 = m_selectSql.IndexOf("FROM"); string selectSql = m_selectSql.Substring(0, idx2); m_selectAsColumns = SearchManager.ParseSelectCommand(selectSql); } else { m_selectSql = m_queryString; m_groupBySql = null; m_selectAsColumns = new Dictionary <string, string>(); } }
/// <summary> /// /// </summary> /// <param name="src"></param> /// <param name="dest"></param> protected void Copy(SearchManager src, SearchManager dest) { dest.m_dataCanPage = src.m_dataCanPage; dest.m_selectAsColumns = src.m_selectAsColumns; base.Copy(src, dest); }
/// <summary> /// ���� /// </summary> /// <returns></returns> public override object Clone() { SearchManager sm = new SearchManager(this.m_tableName, m_defaultOrder, m_selectSql, m_groupBySql, this.EnablePage); Copy(this, sm); return sm; }