• cannot apply the specified columns kentico


    cannot apply the specified columns kentico

    Pagination in union query of two page type

    The error has 2 specific messages in it:

    • [SqlHelper.ReplaceColumns]: Missing ##COLUMNS## macro in the query text
    • cannot apply the specified columns '*, ROW_NUMBER() OVER (ORDER BY [DocumentName]) AS [CMS_RN]'

    There is also a spelling error in your code for the column name:

    DataTable dt= resultQuery.OrderByDescending("DocumentPublihFrom").Page(1,50).Result.Tables[0];

    Should be:

    DataTable dt= resultQuery.OrderByDescending("DocumentPublishFrom").Page(1,50).Result.Tables[0];

    Lastly, what code do these methods have in them and what is the input paramater value:

    • getVideoQuery()
    • getArticleQuery()

    自己遇到的错误,

    System.NotSupportedException: [SqlHelper.ReplaceColumns]: Missing ##COLUMNS## macro in the query text '
    WITH AllData AS 
    (
        SELECT *
    FROM Edenred_CardholderCardSettings ccs
    WHERE ##WHERE##

    SELECT  *, (SELECT COUNT(*) FROM AllData) AS [CMS_TOT] 
    FROM AllData 
    WHERE CMS_RN BETWEEN 1 AND 1000 
    ORDER BY CMS_RN
    ', cannot apply the specified columns '*, ROW_NUMBER() OVER (ORDER BY [ItemID] ASC) AS [CMS_RN]'.
       at CMS.DataEngine.SqlMacroHelper.ReplaceColumns(String queryText, String columns)
       at CMS.DataEngine.SqlMacroHelper.ResolveMacrosInQueryText(QueryMacros queryMacros, String queryText)
       at CMS.DataEngine.SqlMacroHelper.ResolveQueryMacros(QueryMacros queryMacros, String queryText)
       at CMS.DataEngine.QueryParameters.ResolveMacrosInternal(Boolean updateQueryText)
       at CMS.DataEngine.GeneralConnection.ExecuteQuery(QueryParameters query)
       at CMS.DataEngine.GeneralConnection.ExecuteQuery(QueryParameters query, Int32& totalRecords)
       at CMS.DataEngine.DataQueryBase`1.GetDataFromDBInternal()
       at CMS.DataEngine.DataQueryBase`1.GetDataFromDB()
       at CMS.DataEngine.DataQueryBase`1.GetData()
       at CMS.DataEngine.DataQueryBase`1.get_Result()
       at CMS.DataEngine.ObjectQueryBase`2.GetResults(IDataQuery query, Int32& totalRecords)
       at CMS.DataEngine.DataQueryBase`1.GetDataFromDB()
       at CMS.DataEngine.DataQueryBase`1.GetData()
       at CMS.DataEngine.ObjectQueryBase`2.GetData()
       at CMS.DataEngine.DataQueryBase`1.get_Result()
       at CMS.DataEngine.InfoObjectCollection`1.GetData(IWhereCondition where, Int32 offset, Int32 maxRecords, Int32& totalRecords)
       at CMS.DataEngine.InfoObjectCollection`1.GetItemInternal(Int32 index)
       at CMS.DataEngine.InfoObjectCollection`1.GetItem(Int32 index)
       at CMS.DataEngine.InfoObjectCollection`1.get_InternalCount()
       at CMS.DataEngine.InfoObjectCollection`1.<GetEnumeratorInternal>d__234.MoveNext()
       at CMS.DataEngine.InfoObjectCollection`1.<GetEnumerator>d__233.MoveNext()

      var infos = new InfoObjectCollection(objectType);
    
                                var csi = infos.TypeInfo.ClassStructureInfo;
                                var orderByIndex = FindOrderByIndex(csi);
                                if (orderByIndex != null)
                                {
                                    infos.OrderByColumns = orderByIndex.GetOrderBy();
                                }
    
                                infos.PageSize = 1000;
    
                                // Skip object types derived from general data class object type to avoid duplicities
                                if ((infos.TypeInfo.OriginalObjectType == DataClassInfo.OBJECT_TYPE) && (infos.TypeInfo.ObjectType != DataClassInfo.OBJECT_TYPE))
                                {
                                    continue;
                                }
    
                                foreach (BaseInfo info in infos)

    在foreach的时候遇到问题,怀疑是之前的赋值出问题了。

     if (orderByIndex != null)
                                {
                                    infos.OrderByColumns = orderByIndex.GetOrderBy();
                                }

    // CMS.DataEngine.InfoObjectCollection<TInfo>
    /// <summary>
    /// Gets the  enumerator for the collection
    /// </summary>
    // Token: 0x0600116B RID: 4459 RVA: 0x00030D4B File Offset: 0x0002FD4B
    public IEnumerator<TInfo> GetEnumerator()
    {
        IEnumerator<TInfo> baseEnum = this.GetEnumeratorInternal();
        while (baseEnum.MoveNext())
        {
            TInfo tinfo = baseEnum.Current;
            yield return tinfo;
        }
        yield break;
    }
    // CMS.DataEngine.InfoObjectCollection<TInfo>
    /// <summary>
    /// Gets the enumerator for the collection.
    /// </summary>
    // Token: 0x0600116C RID: 4460 RVA: 0x00030D5A File Offset: 0x0002FD5A
    public IEnumerator<TInfo> GetEnumeratorInternal()
    {
        try
        {
            object obj = this.lockObject;
            lock (obj)
            {
                this.mEnumerators++;
            }
            int internalCount = this.InternalCount;
            int num;
            for (int i = 0; i < internalCount; i = num + 1)
            {
                TInfo item = this.GetItem(i);
                if (item != null)
                {
                    yield return item;
                }
                num = i;
            }
            if (this.mNewItems != null)
            {
                int newCount = this.mNewItems.Count;
                for (int j = 0; j < newCount; j = num + 1)
                {
                    TInfo tinfo = this.mNewItems[j];
                    if (tinfo != null && !this.IsRemoved(tinfo))
                    {
                        yield return tinfo;
                    }
                    num = j;
                }
            }
        }
        finally
        {
            object obj2 = this.lockObject;
            lock (obj2)
            {
                int num2 = this.mEnumerators - 1;
                this.mEnumerators = num2;
                if (num2 <= 0)
                {
                    if (this.mClearAfterEnumeration)
                    {
                        this.Clear();
                        this.mClearAfterEnumeration = false;
                    }
                    this.mEnumerators = 0;
                }
            }
        }
        yield break;
        yield break;
    }
    // CMS.DataEngine.InfoObjectCollection<TInfo>
    /// <summary>
    /// Internal count of the items
    /// </summary>
    // Token: 0x1700043C RID: 1084
    // (get) Token: 0x06001121 RID: 4385 RVA: 0x0002F639 File Offset: 0x0002E639
    protected int InternalCount
    {
        get
        {
            this.RegisterClearCacheCallback();
            if (this.mCount >= 0)
            {
                return this.mCount;
            }
            this.GetItem(0);
            if (this.mCount < 0)
            {
                this.mCount = 0;
            }
            return this.mCount;
        }
    }
    // CMS.DataEngine.InfoObjectCollection<TInfo>
    /// <summary>
    /// Gets the item on the specified index.
    /// </summary>
    /// <param name="index">Item index to get</param>
    // Token: 0x0600115D RID: 4445 RVA: 0x0003085C File Offset: 0x0002F85C
    protected TInfo GetItem(int index)
    {
        this.RegisterClearCacheCallback();
        TInfo itemInternal = this.GetItemInternal(index);
        if (itemInternal != null)
        {
            itemInternal.Generalized.IsCachedObject = true;
        }
        return itemInternal;
    }
    // CMS.DataEngine.InfoObjectCollection<TInfo>
    /// <summary>
    /// Gets the item on the specified index.
    /// </summary>
    /// <param name="index">Item index to get</param>
    // Token: 0x0600115E RID: 4446 RVA: 0x00030894 File Offset: 0x0002F894
    private TInfo GetItemInternal(int index)
    {
        if (index < 0)
        {
            index = this.InternalCount - index;
            if (index < 0)
            {
                return default(TInfo);
            }
        }
        if (this.mCount >= 0 && index >= this.mCount)
        {
            return default(TInfo);
        }
        TInfo tinfo = this.Items.ElementAtOrDefault(index);
        if (this.IsRemoved(tinfo))
        {
            return default(TInfo);
        }
        if (tinfo == null)
        {
            if (this.SourceData != null)
            {
                if (this.mCount < 0)
                {
                    this.mCount = DataHelper.GetItemsCount(this.SourceData);
                }
                if (index >= this.mCount)
                {
                    return default(TInfo);
                }
                DataRow dr = null;
                int i = 0;
                int num = index;
                while (i < this.SourceData.Tables.Count)
                {
                    DataTable dataTable = this.SourceData.Tables[i];
                    if (dataTable.Rows.Count > num)
                    {
                        dr = dataTable.Rows[num];
                        break;
                    }
                    i++;
                    num -= dataTable.Rows.Count;
                }
                tinfo = this.CreateNewObject(dr);
                this.EnsureItems(index + 1);
                this.Items[index] = tinfo;
            }
            else
            {
                int num2 = 0;
                int num3 = 0;
                if (this.mAllowPaging)
                {
                    num2 = index / this.PageSize;
                    num3 = this.PageSize;
                }
                else
                {
                    this.mCount = 0;
                }
                IDisposable disposable = null;
                if (this.EnforceReadOnlyDataAccess)
                {
                    disposable = new CMSTransactionScope(null);
                }
                DataSet data;
                using (disposable)
                {
                    data = this.GetData(null, num2 * num3, num3, ref this.mCount);
                }
                if (!DataHelper.DataSourceIsEmpty(data))
                {
                    int num4 = num2 * this.PageSize;
                    foreach (object obj in data.Tables)
                    {
                        foreach (object obj2 in ((DataTable)obj).Rows)
                        {
                            DataRow dr2 = (DataRow)obj2;
                            TInfo tinfo2 = this.CreateNewObject(dr2);
                            this.EnsureItems(num4 + 1);
                            List<TInfo> items = this.Items;
                            int index2 = num4;
                            TInfo value;
                            if ((value = this.Items[num4]) == null)
                            {
                                value = tinfo2;
                            }
                            items[index2] = value;
                            string objectName = this.GetObjectName(tinfo2);
                            if (!string.IsNullOrEmpty(objectName))
                            {
                                this[objectName] = tinfo2;
                            }
                            num4++;
                        }
                    }
                    if (!this.mAllowPaging)
                    {
                        this.mCount = num4;
                    }
                }
                tinfo = this.Items.ElementAtOrDefault(index);
            }
        }
        return tinfo;
    }
    // CMS.DataEngine.InfoObjectCollection<TInfo>
    /// <summary>
    /// Gets the data for the collection.
    /// </summary>
    /// <param name="where">Where condition</param>
    /// <param name="offset">Starting offset for the data</param>
    /// <param name="maxRecords">Maximum number of records to get</param>
    /// <param name="totalRecords">Returning total number of records</param>
    // Token: 0x06001141 RID: 4417 RVA: 0x0002FF10 File Offset: 0x0002EF10
    protected virtual DataSet GetData(IWhereCondition where, int offset, int maxRecords, ref int totalRecords)
    {
        if (this.IsDisconnected)
        {
            return null;
        }
        WhereCondition completeWhere = this.GetCompleteWhereCondition().Where(new IWhereCondition[]
        {
            where
        });
        IDataQuery dataQuery = this.Object.Generalized.GetDataQuery(this.UseObjectTypeCondition, delegate(DataQuerySettings s)
        {
            s.Where(new IWhereCondition[]
            {
                completeWhere
            }).OrderBy(new string[]
            {
                this.OrderByColumns
            }).TopN(this.TopN).Columns(new string[]
            {
                this.Columns
            });
        }, this.CheckLicense);
        dataQuery.IncludeBinaryData = this.LoadBinaryData;
        dataQuery.Offset = offset;
        dataQuery.MaxRecords = maxRecords;
        DataSet result = dataQuery.Result;
        totalRecords = dataQuery.TotalRecords;
        return result;
    }
    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// DataSet with the result
    /// </summary>
    // Token: 0x17000343 RID: 835
    // (get) Token: 0x06000CBF RID: 3263 RVA: 0x00025E3C File Offset: 0x00024E3C
    // (set) Token: 0x06000CC0 RID: 3264 RVA: 0x00025E94 File Offset: 0x00024E94
    public DataSet Result
    {
        get
        {
            if (!this.mDataLoaded)
            {
                object obj = this.lockObject;
                lock (obj)
                {
                    if (!this.mDataLoaded)
                    {
                        this.Execute();
                    }
                }
            }
            return this.mResult;
        }
        protected set
        {
            this.mResult = value;
            this.mDataLoaded = (value != null);
        }
    }
    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Executes the current query and returns it's results as a DataSet
    /// </summary>
    // Token: 0x06000D13 RID: 3347 RVA: 0x00026F26 File Offset: 0x00025F26
    public DataSet Execute()
    {
        this.mResult = this.GetData();
        this.mDataLoaded = true;
        return this.mResult;
    }
    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Executes the query. Sets the total records number during execution.
    /// </summary>
    // Token: 0x06000D15 RID: 3349 RVA: 0x00026F4C File Offset: 0x00025F4C
    protected virtual DataSet GetData()
    {
        if (base.ReturnsNoResults)
        {
            this.TotalRecords = 0;
            return null;
        }
        object obj = this.lockObject;
        DataSet result;
        lock (obj)
        {
            result = (this.HasDataSource ? this.GetDataFromDataSource() : this.GetDataFromDB());
        }
        return result;
    }

    这里有一个判断,是从result = (this.HasDataSource ? this.GetDataFromDataSource() : this.GetDataFromDB());

    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Executes the query
    /// </summary>
    // Token: 0x06000D18 RID: 3352 RVA: 0x0002700C File Offset: 0x0002600C
    protected virtual DataSet GetDataFromDB()
    {
        IDataQuery executingQuery = this.GetExecutingQuery(null);
        if (executingQuery == null)
        {
            return null;
        }
        if (executingQuery == this)
        {
            return this.GetDataFromDBInternal();
        }
        int totalRecords = 0;
        DataSet results = this.GetResults(executingQuery, ref totalRecords);
        this.TotalRecords = totalRecords;
        return results;
    }
    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Executes the current query and returns it's results as a DataSet
    /// </summary>
    // Token: 0x06000D19 RID: 3353 RVA: 0x00027044 File Offset: 0x00026044
    private DataSet GetDataFromDBInternal()
    {
        int totalRecords = 0;
        object obj = this.lockObject;
        DataSet result;
        lock (obj)
        {
            GeneralConnection connection = this.GetConnection();
            QueryParameters completeQueryParameters = this.GetCompleteQueryParameters(null);
            result = connection.ExecuteQuery(completeQueryParameters, ref totalRecords);
            this.TotalRecords = totalRecords;
        }
        return result;
    }
    // CMS.DataEngine.GeneralConnection
    /// <summary>
    /// Executes query and returns result as a DataSet. Returns the total number of result items.
    /// </summary>
    /// <param name="query">Query parameters</param>
    /// <param name="totalRecords">Returns total records</param>
    // Token: 0x0600184D RID: 6221 RVA: 0x00045C5C File Offset: 0x00044C5C
    [HideFromDebugContext]
    public virtual DataSet ExecuteQuery(QueryParameters query, ref int totalRecords)
    {
        query = query.GetParametersForExecution(totalRecords != -2, false);
        DataSet dataSet = this.ExecuteQuery(query);
        totalRecords = 0;
        SqlHelper.ProcessPagedResults(dataSet, ref totalRecords);
        return dataSet;
    }
    // CMS.DataEngine.GeneralConnection
    /// <summary>
    /// Executes the query and returns the number of rows affected.
    /// </summary>
    /// <param name="query">Query parameters.</param>
    // Token: 0x06001850 RID: 6224 RVA: 0x00045DEC File Offset: 0x00044DEC
    public virtual int ExecuteNonQuery(QueryParameters query)
    {
        query.ExecutionType = QueryExecutionTypeEnum.ExecuteNonQuery;
        IDataConnection dataConnection = this.GetExecutingConnection(query);
        int num;
        using (ExecuteQueryHandler<int> executeQueryHandler = SqlEvents.ExecuteNonQuery.StartEvent(query, dataConnection))
        {
            ExecuteQueryEventArgs<int> eventArguments = executeQueryHandler.EventArguments;
            dataConnection = eventArguments.Connection;
            num = eventArguments.Result;
            if (executeQueryHandler.CanContinue() && num == 0)
            {
                query.ResolveMacros();
                bool flag = false;
                bool flag2 = false;
                try
                {
                    this.LogQueryStart(query, dataConnection);
                    if (!dataConnection.IsOpen())
                    {
                        dataConnection.Open();
                        flag = true;
                    }
                    if (query.RequiresTransaction && !dataConnection.IsTransaction())
                    {
                        dataConnection.BeginTransaction();
                        flag2 = true;
                    }
                    num = dataConnection.ExecuteNonQuery(query.Text, query.Params, query.Type, false);
                    eventArguments.Result = num;
                    if (flag2)
                    {
                        dataConnection.CommitTransaction();
                        flag2 = false;
                    }
                }
                finally
                {
                    if (flag2)
                    {
                        dataConnection.RollbackTransaction();
                    }
                    if (flag)
                    {
                        dataConnection.Close();
                    }
                    this.LogQueryEnd(num);
                }
            }
            executeQueryHandler.FinishEvent();
            num = executeQueryHandler.EventArguments.Result;
        }
        return num;
    }
    // CMS.DataEngine.QueryParameters
    /// <summary>
    /// Resolves the query macros in <see cref="P:CMS.DataEngine.QueryParameters.Text" /> property value.
    /// </summary>
    // Token: 0x06001216 RID: 4630 RVA: 0x00033216 File Offset: 0x00032216
    public void ResolveMacros()
    {
        this.ResolveMacrosInternal(true);
    }
    // CMS.DataEngine.QueryParameters
    /// <summary>
    /// Resolves the query macros in <see cref="P:CMS.DataEngine.QueryParameters.Text" /> property value.
    /// </summary>
    /// <param name="updateQueryText">If true, the query text is updated with resolved version</param>
    /// <returns>Resolved query text</returns>
    // Token: 0x06001217 RID: 4631 RVA: 0x00033220 File Offset: 0x00032220
    private string ResolveMacrosInternal(bool updateQueryText)
    {
        string text = this.Text;
        if (!this.mMacrosResolved)
        {
            if (this.Params != null)
            {
                text = this.Params.ResolveMacros(text);
            }
            if (this.Macros != null)
            {
                text = this.Macros.ResolveMacros(text);
            }
            if (updateQueryText)
            {
                this.Text = text;
                this.mMacrosResolved = true;
            }
        }
        return text;
    }

    public QueryMacros Macros { get; set; }

    public QueryDataParameters Params { get; set; }

    text = this.Macros.ResolveMacros(text);

    // CMS.DataEngine.QueryMacros
    /// <summary>
    /// Resolves the given macros within a query
    /// </summary>
    /// <param name="queryText">Query text</param>
    // Token: 0x06000758 RID: 1880 RVA: 0x00017027 File Offset: 0x00016027
    public string ResolveMacros(string queryText)
    {
        return SqlMacroHelper.ResolveQueryMacros(this, queryText);
    }
    // CMS.DataEngine.SqlMacroHelper
    /// <summary>
    /// Resolves the query macros.
    /// </summary>
    /// <param name="queryMacros">Query macros</param>
    /// <param name="queryText">Query text</param>
    // Token: 0x0600072C RID: 1836 RVA: 0x0001674B File Offset: 0x0001574B
    public static string ResolveQueryMacros(QueryMacros queryMacros, string queryText)
    {
        if (queryText == "SELECT ##DISTINCT## ##TOPN## ##COLUMNS## 
    FROM ##SOURCE## 
    WHERE ##WHERE## 
    GROUP BY ##GROUPBY## 
    HAVING ##HAVING## ORDER BY ##ORDERBY##")
        {
            queryText = SqlMacroHelper.BuildSelectQuery(queryMacros);
        }
        else
        {
            queryText = SqlMacroHelper.ResolveMacrosInQueryText(queryMacros, queryText);
        }
        return queryText;
    }
    // CMS.DataEngine.SqlMacroHelper
    /// <summary>
    /// Resolves the query macros in the given query text using regular expressions for the query macros and replacements. 
    /// </summary>
    /// <param name="queryMacros">Query macros</param>
    /// <param name="queryText">Query text</param>
    // Token: 0x0600072D RID: 1837 RVA: 0x00016770 File Offset: 0x00015770
    private static string ResolveMacrosInQueryText(QueryMacros queryMacros, string queryText)
    {
        queryText = SqlMacroHelper.ReplaceDistinct(queryText, queryMacros.Distinct);
        queryText = SqlMacroHelper.ReplaceTopN(queryText, queryMacros.TopN);
        queryText = SqlMacroHelper.ReplaceColumns(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.Columns));
        queryText = SqlMacroHelper.ReplaceSource(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.Source), SqlMacroHelper.EncodeMacroInText(queryMacros.DefaultSource));
        queryText = SqlMacroHelper.ReplaceWhere(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.Where), false);
        queryText = SqlMacroHelper.ReplaceGroupBy(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.GroupBy));
        queryText = SqlMacroHelper.ReplaceHaving(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.Having));
        queryText = SqlMacroHelper.ReplaceOrderBy(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.OrderBy));
        queryText = SqlMacroHelper.ReplaceValues(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.Values));
        queryText = SqlMacroHelper.ReplaceOutput(queryText, SqlMacroHelper.EncodeMacroInText(queryMacros.Output));
        queryText = SqlMacroHelper.DecodeMacroInText(queryText);
        return queryText;
    }
    // CMS.DataEngine.SqlMacroHelper
    /// <summary>
    /// Replaces columns macro in the query text
    /// </summary>
    /// <param name="queryText">Query text</param>
    /// <param name="columns">Columns</param>
    // Token: 0x06000739 RID: 1849 RVA: 0x00016D8C File Offset: 0x00015D8C
    public static string ReplaceColumns(string queryText, string columns)
    {
        columns = SqlMacroHelper.GetColumnsString(columns);
        if (!SqlMacroHelper.ReplaceMacro(ref queryText, "##COLUMNS##", columns, null) && columns != "*" && columns != "#NONE#")
        {
            throw new NotSupportedException(string.Concat(new string[]
            {
                "[SqlHelper.ReplaceColumns]: Missing ##COLUMNS## macro in the query text '",
                queryText,
                "', cannot apply the specified columns '",
                columns,
                "'."
            }));
        }
        return queryText;
    }

    来源QueryParameters completeQueryParameters = this.GetCompleteQueryParameters(null);

        private DataSet GetDataFromDBInternal()
            {
                int totalRecords = 0;
                object obj = this.lockObject;
                DataSet result;
                lock (obj)
                {
                    GeneralConnection connection = this.GetConnection();
                    QueryParameters completeQueryParameters = this.GetCompleteQueryParameters(null);
                    result = connection.ExecuteQuery(completeQueryParameters, ref totalRecords);
                    this.TotalRecords = totalRecords;
                }
                return result;
            }
    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Returns query parameter container filled with the complete settings of current query.
    /// </summary>
    /// <remarks>
    /// Wraps distinct paged query as nested so the row number column required for paging doesn't thwart the distinct selection.
    /// </remarks>
    /// <param name="settings">Query settings to use</param>
    // Token: 0x06000D1F RID: 3359 RVA: 0x00027254 File Offset: 0x00026254
    public QueryParameters GetCompleteQueryParameters(DataQuerySettings settings = null)
    {
        IDataQuery executingQuery = this.GetExecutingQuery(null);
        if (executingQuery == null)
        {
            return null;
        }
        if (executingQuery == this)
        {
            return this.GetCompleteQueryParametersInternal(settings);
        }
        return executingQuery.GetCompleteQueryParameters(settings);
    }
    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Returns query parameter container filled with the complete settings of current query.
    /// </summary>
    /// <remarks>
    /// Wraps distinct paged query as nested so the row number column required for paging doesn't thwart the distinct selection.
    /// </remarks>
    /// <param name="settings">Query settings to use</param>
    // Token: 0x06000D20 RID: 3360 RVA: 0x00027284 File Offset: 0x00026284
    private QueryParameters GetCompleteQueryParametersInternal(DataQuerySettings settings = null)
    {
        DataQueryBase<TQuery> dataQueryBase = this;
        settings = (settings ?? dataQueryBase.GetCompleteSettings(null));
        if (settings.IsPagedQuery)
        {
            if (settings.SelectDistinct)
            {
                dataQueryBase = dataQueryBase.AsNestedInternal<TQuery>(settings, null);
                settings = dataQueryBase.GetCompleteSettings(null);
            }
            else
            {
                this.TranslateOrderByColumn(settings);
            }
        }
        return dataQueryBase.GetQueryParameters(settings);
    }

    settings = (settings ?? dataQueryBase.GetCompleteSettings(null));

    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Gets the complete parameters for the query execution. The parameters are always a new instance of DataQuerySettings which can be further modified without any impact to the query itself.
    /// </summary>
    /// <param name="executingQuery">Executing query for which the parameters are retrieved</param>
    // Token: 0x06000CE3 RID: 3299 RVA: 0x00026284 File Offset: 0x00025284
    public virtual DataQuerySettings GetCompleteSettings(IDataQuery executingQuery = null)
    {
        DataQuerySettings dataQuerySettings = new DataQuerySettings();
        object obj = this.lockObject;
        lock (obj)
        {
            this.CopyPropertiesTo(dataQuerySettings);
            this.EnsureColumns(dataQuerySettings);
            this.EnsureDefaultOrderBy(dataQuerySettings);
            bool hasDataSource = this.HasDataSource;
            if (executingQuery != null)
            {
                hasDataSource = executingQuery.HasDataSource;
            }
            if (!hasDataSource)
            {
                this.EnsureDefaultSource(dataQuerySettings);
            }
        }
        return dataQuerySettings;
    }

    直接用Kentico11的源码调试得到的堆栈信息

    CMS.DataEngine.dll!CMS.DataEngine.SqlMacroHelper.ResolveQueryMacros(CMS.DataEngine.QueryMacros queryMacros, string queryText) Line 137 C#
    CMS.DataEngine.dll!CMS.DataEngine.QueryMacros.ResolveMacros(string queryText) Line 198 C#
    CMS.DataEngine.dll!CMS.DataEngine.SqlHelper.PrepareWithQuery(string queryText, string where, string orderBy, int topN, string extraColumns) Line 1017 C#
    CMS.DataEngine.dll!CMS.DataEngine.SqlHelper.PreparePagedQuery(string queryText, CMS.DataEngine.QueryMacros macros, int offset, int maxRecords, bool getTotal, bool subQuery) Line 943 C#
    CMS.DataEngine.dll!CMS.DataEngine.QueryParameters.FinalizeForExecution(bool getTotal, bool subQuery) Line 336 C#
    CMS.DataEngine.dll!CMS.DataEngine.QueryParameters.GetParametersForExecution(bool getTotal, bool subQuery) Line 293 C#
    > CMS.DataEngine.dll!CMS.DataEngine.GeneralConnection.ExecuteQuery(CMS.DataEngine.QueryParameters query, ref int totalRecords) Line 311 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.DataQuery>.GetDataFromDBInternal() Line 1760 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.DataQuery>.GetDataFromDB() Line 1730 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.DataQuery>.GetData() Line 1678 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.DataQuery>.Execute() Line 1641 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.DataQuery>.Result.get() Line 125 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>>.GetResults(CMS.DataEngine.IDataQuery query, ref int totalRecords) Line 1778 C#
    CMS.DataEngine.dll!CMS.DataEngine.ObjectQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>, CMS.CustomTables.CustomTableItem>.GetResults(CMS.DataEngine.IDataQuery query, ref int totalRecords) Line 423 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>>.GetDataFromDB() Line 1735 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>>.GetData() Line 1678 C#
    CMS.DataEngine.dll!CMS.DataEngine.ObjectQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>, CMS.CustomTables.CustomTableItem>.GetData() Line 445 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>>.Execute() Line 1641 C#
    CMS.DataEngine.dll!CMS.DataEngine.DataQueryBase<CMS.DataEngine.ObjectQuery<CMS.CustomTables.CustomTableItem>>.Result.get() Line 125 C#
    CMS.DataEngine.dll!CMS.DataEngine.InfoObjectCollection<CMS.DataEngine.BaseInfo>.GetData(CMS.DataEngine.IWhereCondition where, int offset, int maxRecords, ref int totalRecords) Line 1437 C#
    CMS.DataEngine.dll!CMS.DataEngine.InfoObjectCollection<CMS.DataEngine.BaseInfo>.GetItemInternal(int index) Line 2175 C#
    CMS.DataEngine.dll!CMS.DataEngine.InfoObjectCollection<CMS.DataEngine.BaseInfo>.GetItem(int index) Line 2055 C#
    CMS.DataEngine.dll!CMS.DataEngine.InfoObjectCollection<CMS.DataEngine.BaseInfo>.InternalCount.get() Line 901 C#
    CMS.DataEngine.dll!CMS.DataEngine.InfoObjectCollection<CMS.DataEngine.BaseInfo>.GetEnumeratorInternal() Line 2456 C#
    CMS.DataEngine.dll!CMS.DataEngine.InfoObjectCollection<CMS.DataEngine.BaseInfo>.GetEnumerator() Line 2436 C#
    CMSApp.dll!Global.Global() Line 30 C#
    [External Code]

    相比而言,得到了更多的信息,可以知道queryText这个参数是怎么拼凑出来的

    CMS.DataEngine.dll!CMS.DataEngine.QueryMacros.ResolveMacros(string queryText) Line 198 C#
    CMS.DataEngine.dll!CMS.DataEngine.SqlHelper.PrepareWithQuery(string queryText, string where, string orderBy, int topN, string extraColumns) Line 1017 C#
    CMS.DataEngine.dll!CMS.DataEngine.SqlHelper.PreparePagedQuery(string queryText, CMS.DataEngine.QueryMacros macros, int offset, int maxRecords, bool getTotal, bool subQuery) Line 943 C#
    CMS.DataEngine.dll!CMS.DataEngine.QueryParameters.FinalizeForExecution(bool getTotal, bool subQuery) Line 336 C#
    CMS.DataEngine.dll!CMS.DataEngine.QueryParameters.GetParametersForExecution(bool getTotal, bool subQuery) Line 293 C#

    CMS.DataEngine.dll!CMS.DataEngine.GeneralConnection.ExecuteQuery(CMS.DataEngine.QueryParameters query, ref int totalRecords) Line 311 C#

    query = query.GetParametersForExecution(totalRecords != -2, false);

    // CMS.DataEngine.QueryParameters
    /// <summary>
    /// Gets the query parameters for query execution
    /// </summary>
    /// <param name="getTotal">If true, the query is configured to get total number of records when paging is enabled</param>
    /// <param name="subQuery">If true, the query is used as a sub-query</param>
    // Token: 0x06001218 RID: 4632 RVA: 0x00033278 File Offset: 0x00032278
    internal QueryParameters GetParametersForExecution(bool getTotal = true, bool subQuery = false)
    {
        QueryParameters queryParameters = this.Clone();
        queryParameters.FinalizeForExecution(getTotal, subQuery);
        return queryParameters;
    }
    // CMS.DataEngine.QueryParameters
    /// <summary>
    /// Finalizes the given query parameters for execution within SQL connection
    /// </summary>
    /// <param name="getTotal">If true, the query is configured to get total number of records when paging is enabled</param>
    /// <param name="subQuery">If true, the query is used as a sub-query</param>
    // Token: 0x0600121A RID: 4634 RVA: 0x00033324 File Offset: 0x00032324
    internal void FinalizeForExecution(bool getTotal = true, bool subQuery = false)
    {
        int maxRecords = this.MaxRecords;
        if (maxRecords > 0)
        {
            SqlHelper.CheckPagedQuery(this);
            QueryMacros macros = this.Macros;
            string text = SqlHelper.PreparePagedQuery(this.Text, macros, this.Offset, maxRecords, getTotal, subQuery);
            this.Text = text;
            this.Offset = 0;
            this.MaxRecords = 0;
        }
        this.IsForExecution = true;
    }
    // CMS.DataEngine.SqlHelper
    /// <summary>
    /// Prepares the query for paging, adds additional system columns and updates the columns list.
    /// </summary>
    /// <param name="queryText">Query text</param>
    /// <param name="macros">Query expressions</param>
    /// <param name="offset">Index of first record to get</param>
    /// <param name="maxRecords">Maximum number of records to get</param>
    /// <param name="getTotal">If true, the query should get the total number of records</param>
    /// <param name="subQuery">If true, the query is used as a sub-query</param>
    // Token: 0x06001067 RID: 4199 RVA: 0x0002D0F4 File Offset: 0x0002C0F4
    public static string PreparePagedQuery(string queryText, QueryMacros macros, int offset, int maxRecords, bool getTotal = true, bool subQuery = false)
    {
        string text = macros.Columns;
        if (string.IsNullOrEmpty(text))
        {
            text = "*";
        }
        SqlHelper.HandleEmptyColumns(ref text);
        string text2 = macros.OrderBy;
        SqlHelper.HandleEmptyColumns(ref text2);
        if (!string.IsNullOrEmpty(text2))
        {
            if (macros.TopN <= 0)
            {
                queryText = SqlMacroHelper.RemoveOrderBy(queryText);
            }
            string columns = text;
            string addColumns = new RowNumberColumn("CMS_RN", text2).ToString();
            text = SqlHelper.AddColumns(text, addColumns, false);
            string between = SqlHelper.GetBetween("CMS_RN", offset + 1, offset + maxRecords);
            string text3 = getTotal ? SqlHelper.GetTotalColumn(macros.Total, subQuery) : null;
            if (subQuery)
            {
                string columns2 = SqlHelper.AddColumns(columns, text3, false);
                queryText = SqlHelper.PrepareNestedQuery(queryText, between, null, 0, columns2);
            }
            else
            {
                queryText = SqlHelper.PrepareWithQuery(queryText, between, "CMS_RN", 0, text3);
            }
            text2 = null;
        }
        macros.OrderBy = text2;
        macros.Columns = text;
        return queryText;
    }

    对应的this.Macros.ToString(), this的类型是CMS.DataEngine.QueryParameters

    TOPN: 0,
    COLUMNS: *, ROW_NUMBER() OVER (ORDER BY [ItemID]) AS [CMS_RN],
    SOURCE: Edenred_CardholderCardSettings,

    this.Name

    Company.CardholderCardSettings.selectall

    Kentico11DataEngineQueryDataDataQueryBase.cs中的CustomQueryText是

    SELECT ##DISTINCT## ##TOPN## ##COLUMNS##
    FROM ##SOURCE##
    WHERE ##WHERE##
    GROUP BY ##GROUPBY##
    HAVING ##HAVING## ORDER BY ##ORDERBY##

    参数settings.ToString()

    TOPN: 0,
    COLUMNS: (COUNT(*)) AS [Count],
    SOURCE: (
    SELECT *
    FROM CMS_Class
    WHERE [ClassName] = @ClassName
    ) AS SubData,

    settings.Parameters 里面有一个元素,里面存储的value是表名company.cardholdercardsettings

    CustomQueryText为null,FullQueryName是company.cardholdercardsettings.selectall

    // Get query
    var qi = QueryInfoProvider.GetQueryInfo(FullQueryName, true);

    // Prepare the query
    query = new QueryParameters(qi, parameters, expressions);

    FullQueryName是company.cardholdercardsettings.selectall 来进行查找

    // CMS.DataEngine.DataQueryBase<TQuery>
    /// <summary>
    /// Represents a full query name of the query
    /// </summary>
    // Token: 0x17000346 RID: 838
    // (get) Token: 0x06000CC5 RID: 3269 RVA: 0x00025EF4 File Offset: 0x00024EF4
    public virtual string FullQueryName
    {
        get
        {
            string text = this.QueryName;
            string className = this.ClassName;
            if (string.IsNullOrEmpty(text))
            {
                text = (QueryInfoProvider.QueryIsExplicitlyDefined(className, "selectall") ? "selectall" : "generalselect");
            }
            return string.Format("{0}.{1}", className, text);
        }
    }
        public static QueryInfo GetQueryInfo(string name, bool throwException)
            {
                var result = ProviderObject.GetQueryInfoInternal(name);
    
                // Throw exception if required
                if ((result == null) && throwException)
                {
                    throw new Exception("[QueryProvider.GetQuery]: Query " + name + " not found!");
                }
    
                return result;
            }

    Kentico11DataEngineClassesQueriesQueryInfoProvider.cs

    Kentico11DataEngineAbstractProvidersDictionariesBaseProviderDictionary.cs

    infos.ByFullName中的  private readonly ICacheStorage<TKey, TValue> mCache;存储了数据  

    // CMS.DataEngine.AbstractInfoProvider<TInfo, TProvider, TQuery>
    /// <summary>
    /// Loads all objects from the database to memory.
    /// </summary>
    // Token: 0x060017BF RID: 6079 RVA: 0x000443D4 File Offset: 0x000433D4
    protected void LoadInfos()
    {
        if (!this.HashtableSettings.UseHashtables)
        {
            return;
        }
        if (ProviderHelper.LoadTables(this.infos))
        {
            object obj = this.hashtableLock;
            lock (obj)
            {
                if (ProviderHelper.LoadTables(this.infos))
                {
                    this.infos = this.CreateHashtables();
                    this.infos.LoadDefaultItems();
                }
            }
        }
    }
    // CMS.DataEngine.AbstractInfoProvider<TInfo, TProvider, TQuery>
    /// <summary>
    /// Creates the provider hashtables
    /// </summary>
    // Token: 0x060017C0 RID: 6080 RVA: 0x00044450 File Offset: 0x00043450
    private ProviderDictionaryCollection CreateHashtables()
    {
        string objectType = this.TypeInfo.ObjectType;
        ProviderDictionaryCollection providerDictionaryCollection = new ProviderDictionaryCollection(objectType, this.HashtableSettings.Load, new Action<ProviderDictionaryCollection, object>(this.LoadData), null);
        if (this.HashtableSettings.Name)
        {
            string text = this.TypeInfo.CodeNameColumn;
            if (this.TypeInfo.SiteIDColumn != "[Unknown]")
            {
                text = text + ";" + this.TypeInfo.SiteIDColumn;
            }
            if (this.TypeInfo.GroupIDColumn != "[Unknown]")
            {
                text = text + ";" + this.TypeInfo.GroupIDColumn;
            }
            providerDictionaryCollection.ByCodeName = new ProviderInfoDictionary<string>(objectType, text, null, false, this.HashtableSettings.UseWeakReferences);
        }
        if (this.HashtableSettings.ID)
        {
            providerDictionaryCollection.ById = new ProviderInfoDictionary<int>(objectType, this.TypeInfo.IDColumn, null, false, this.HashtableSettings.UseWeakReferences);
        }
        if (this.HashtableSettings.GUID)
        {
            if (this.TypeInfo.SiteIDColumn == "[Unknown]")
            {
                providerDictionaryCollection.ByGuid = new ProviderInfoDictionary<Guid>(objectType, this.TypeInfo.GUIDColumn, null, false, this.HashtableSettings.UseWeakReferences);
            }
            else
            {
                string columnNames = this.TypeInfo.GUIDColumn + ";" + this.TypeInfo.SiteIDColumn;
                providerDictionaryCollection.ByGuidAndSite = new ProviderInfoDictionary<string>(objectType, columnNames, null, false, this.HashtableSettings.UseWeakReferences);
            }
        }
        IFullNameInfoProvider fullNameInfoProvider = this as IFullNameInfoProvider;
        if (this.HashtableSettings.FullName && fullNameInfoProvider != null)
        {
            providerDictionaryCollection.ByFullName = fullNameInfoProvider.GetFullNameDictionary();
        }
        return providerDictionaryCollection;
    }
    // CMS.DataEngine.QueryInfoProvider
    /// <summary>
    /// Creates new dictionary for caching the objects by full name
    /// </summary>
    // Token: 0x06000F3C RID: 3900 RVA: 0x0002AEA8 File Offset: 0x00029EA8
    public ProviderInfoDictionary<string> GetFullNameDictionary()
    {
        return new ProviderInfoDictionary<string>("cms.query", "QueryName;ClassID", null, false, false);
    }

    最后发现,sql语句是,通过组合筛选得到sql。而这里的sql不符合规则,导致了问题

    SELECT b.ClassName,
           b.ClassDisplayName,
           a.*
    FROM CMS_Query AS a
        INNER JOIN dbo.CMS_Class AS b
            ON a.ClassID = b.ClassID
    WHERE a.QueryName = N'selectall'
          AND b.ClassName = 'className';
  • 相关阅读:
    beanshell-接口返回结果与预期结果比较(预期结果为两个接口差集)-两个set集合的比较
    jmeter断言之Beanshell断言(判断数据库结果是否符合预期)
    beanshell查询结果多条取满足条件的一条数据作为前置步骤给其他接口参数使用
    beanshell判断响应数据是jsonobject类型还是jsonarray类型
    yarn global add安装的目录(window10)
    React 使用axios,将axios注入到全局使用
    解决H5支付宝支付空白页问题
    React Ant Design Mobile ListView 上拉刷新,下拉加载
    vue点击实现复制
    element 设置table表头样式
  • 原文地址:https://www.cnblogs.com/chucklu/p/14944742.html
Copyright © 2020-2023  润新知