/// <summary> /// Generates a dictionary containing all the columns from the select that are renamed (using AS) /// the hashtable has the original values as values and the translated values as keys. /// </summary> /// <param name="querySet"></param> /// <param name="sBuilder"></param> /// <returns></returns> private Dictionary <DbField, SelectColumnInfo> CreateDictionaryFromSelect(DataQueryResult querySet, SelectBuilder sBuilder) { Dictionary <DbField, SelectColumnInfo> translation = new Dictionary <DbField, SelectColumnInfo> (); string [] columnNames = sBuilder.SelectClause.Select(cInfo => cInfo.ColumnName).ToArray(); querySet.Columns = fieldsTable.TranslateToColumnInfo(columnNames); querySet.MarkTranslated(); querySet.MarkHidden(); querySet.MarkPermanent(); for (int i = 0; i < querySet.Columns.Length; i++) { if (querySet.Columns [i].Field == null) { if (!querySet.Columns [i].IsTranslated) { throw new Exception("Unable to translate column " + columnNames [i]); } } else { SelectColumnInfo cInfo = sBuilder.SelectClause [i]; if (cInfo.IsRenamed) { translation.Add(querySet.Columns [i].Field, cInfo); } } } return(translation); }
public override long GetQueryRowsCount(string commandText, params DbParam [] parameters) { SelectBuilder sBuilder = new SelectBuilder(fieldsTable, commandText); // Optimize the query for fast execution for (int i = sBuilder.SelectClause.Count - 1; i >= 0; i--) { SelectColumnInfo cInfo = sBuilder.SelectClause [i]; if (cInfo.IsGrouped || cInfo.IsAggregated || sBuilder.HavingClause.Any(having => Regex.IsMatch(having.Key, string.Format(@"([^\w]*)(\w\.)*{0}([^\w]*)", cInfo.ColumnName)))) { continue; } sBuilder.SelectClause.RemoveAt(i); } if (sBuilder.SelectClause.Count == 0) { sBuilder.SelectClause.Add(new SelectColumnInfo("1")); } sBuilder.OrderByClause.Clear(); return(ExecuteScalar <long> (string.Format("SELECT COUNT(*) FROM ({0}) as CountsTable", sBuilder), parameters)); }
public override string GetQueryWithFilter(string commandText, IList <DbField> filterFields, string filter, out DbParam [] pars) { SelectBuilder sBuilder = new SelectBuilder(fieldsTable, commandText); string [] filterKeys = filter.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries); List <DbParam> p = new List <DbParam> (); foreach (string key in filterKeys) { StringBuilder condition = new StringBuilder(); DbParam par = GetFilterParam(p, key); p.Add(par); foreach (DbField field in filterFields) { SelectColumnInfo colInfo = sBuilder.SelectClause [field]; if (colInfo == null) { throw new ArgumentException(string.Format("Cannot search for field {0} as it is not populated from the database", field)); } if (condition.Length > 0) { condition.Append(" OR "); } condition.AppendFormat(GetFilterCondition(colInfo.SourceExpression, par)); } sBuilder.WhereClause.Add(new KeyValuePair <string, ConditionCombineLogic> (string.Format("({0})", condition), ConditionCombineLogic.And)); } pars = p.ToArray(); return(sBuilder.ToString()); }