.net MDX查询生成器实现

.net MDX查询生成器实现,.net,sql-server,mdx,adomd.net,.net,Sql Server,Mdx,Adomd.net,我正在使用Microsoft.AnalysisServices.AdomdClient查询多维数据集。我有一个多维表达式(MDX)查询,我将其传递给AdomdCommand对象以查询我的多维数据集。 我希望有一个MDX构建器类,可以用来传递度量、维度、级别等的列表,并生成相应MDX查询的字符串 这已经存在了吗?这是一个很好的开始: 如果您可以选择开源代码,则此库包含一个MDX生成器,包括: 可以使用Ranet Olap在模板上生成MDX查询。下面是一个简单的示例代码。它显示了典型的用例,包括过

我正在使用Microsoft.AnalysisServices.AdomdClient查询多维数据集。我有一个多维表达式(MDX)查询,我将其传递给
AdomdCommand
对象以查询我的多维数据集。 我希望有一个MDX构建器类,可以用来传递度量、维度、级别等的列表,并生成相应MDX查询的字符串

这已经存在了吗?

这是一个很好的开始:

如果您可以选择开源代码,则此库包含一个MDX生成器,包括:
可以使用Ranet Olap在模板上生成MDX查询。下面是一个简单的示例代码。它显示了典型的用例,包括过滤器设置和使用多种度量

using System.Collections.Generic;
using System.Windows.Forms;
using Ranet.Olap.Core.Common;
using Ranet.Olap.Core.Data;
using Ranet.Olap.Core.Managers;
using Ranet.Olap.Core.Types;
using Ranet.Olap.Core.Wrappers;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            startWork();
        }

        public static void startWork()
        {

            var mdx = new QueryBuilderParameters
            {
                CubeName = "[Adventure Works]",
                SubCube = "",
                MdxDesignerSetting = new MDXDesignerSettingWrapper(),
                CalculatedMembers = new List<CalcMemberInfo>(),
                CalculatedNamedSets = new List<CalculatedNamedSetInfo>(),
                AreaWrappersFilter = new List<AreaItemWrapper>(),
                AreaWrappersColumns = new List<AreaItemWrapper>(),
                AreaWrappersRows = new List<AreaItemWrapper>(),
                AreaWrappersData = new List<AreaItemWrapper>()
            };

            //define parameters
            mdx.MdxDesignerSetting.HideEmptyColumns = false;
            mdx.MdxDesignerSetting.HideEmptyRows = false;
            mdx.MdxDesignerSetting.UseVisualTotals = false;
            mdx.MdxDesignerSetting.SubsetCount = 0;

            //columns
            var itemCol1 = new Hierarchy_AreaItemWrapper
            {
                AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper,
                UniqueName = "[Date].[Calendar]"
            };
            mdx.AreaWrappersColumns.Add(itemCol1);

            //rows
            var itemRow1 = new Hierarchy_AreaItemWrapper
            {
                AreaItemType = AreaItemWrapperType.Hierarchy_AreaItemWrapper,
                UniqueName = "[Customer].[Customer Geography]"
            };
            mdx.AreaWrappersRows.Add(itemRow1);

            //data
            var itemData1 = new Measure_AreaItemWrapper
            {
                AreaItemType = AreaItemWrapperType.Measure_AreaItemWrapper,
                UniqueName = "[Measures].[Internet Order Count]"
            };
            mdx.AreaWrappersData.Add(itemData1);
            var itemData2 = new Measure_AreaItemWrapper
            {
                AreaItemType = AreaItemWrapperType.Measure_AreaItemWrapper,
                UniqueName = "[Measures].[Internet Sales Amount]"
            };
            mdx.AreaWrappersData.Add(itemData2);
            //if Measures in Data area > 1 - add special element VALUES in COLUMNS or ROWS areas
            var itemCol2 = new Values_AreaItemWrapper
            {
                AreaItemType = AreaItemWrapperType.NamedSet_AreaItemWrapper,
            };
            mdx.AreaWrappersColumns.Add(itemCol2);

            //filter
            var itemFilter1 = new Level_AreaItemWrapper
            {
                AreaItemType = AreaItemWrapperType.Level_AreaItemWrapper,
                UniqueName = "[Date].[Calendar Year].[Calendar Year]",
                HierarchyUniqueName = "[Date].[Calendar Year]",
                CompositeFilter = new Composite_FilterWrapper()
            };
            itemFilter1.CompositeFilter.IsUsed = true;
            itemFilter1.CompositeFilter.MembersFilter.IsUsed = true;


            // two options to choose
            // option 1 - simply SET
            //itemFilter1.CompositeFilter.MembersFilter.FilterSet = "{[Date].[Calendar Year].&[2007], [Date].[Calendar Year].&[2008]}";
            #region
            // option 2 - collection Members

            var mcf1 = new MemberChoiceSettings
            {
                SelectState = SelectStates.Selected_Self,
                Info =
                    new MemberData
                    {
                        UniqueName = "[Date].[Calendar Year].&[2007]",
                        HierarchyUniqueName = "[Date].[Calendar Year]",
                        Caption = "2007"
                    }
            };
            itemFilter1.CompositeFilter.MembersFilter.SelectedInfo.Add(mcf1);
            var mcf2 = new MemberChoiceSettings
            {
                SelectState = SelectStates.Selected_Self,
                Info =
                    new MemberData
                    {
                        UniqueName = "[Date].[Calendar Year].&[2008]",
                        HierarchyUniqueName = "[Date].[Calendar Year]",
                        Caption = "2008"
                    }
            };
            itemFilter1.CompositeFilter.MembersFilter.SelectedInfo.Add(mcf2);
            // build SET on collection
            itemFilter1.CompositeFilter.MembersFilter.BuildFilterSet();

            #endregion
            mdx.AreaWrappersFilter.Add(itemFilter1);

            string query = MdxQueryBuilder.Default.BuildQuery(mdx, null);
            MessageBox.Show(query);

        }
    }
}

这个工具有一个语法分析器作为它的一部分:并不是像你所要求的那样真正用于构造MDX的类,但是其中的库可能很有用。
SELECT 
HIERARCHIZE(CrossJoin(HIERARCHIZE([Date].[Calendar].Levels(0).Members), {[Measures].[Internet Order Count], [Measures].[Internet Sales Amount]})) DIMENSION PROPERTIES PARENT_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, CUSTOM_ROLLUP, UNARY_OPERATOR, KEY0 ON 0, 
HIERARCHIZE(HIERARCHIZE([Customer].[Customer Geography].Levels(0).Members)) DIMENSION PROPERTIES PARENT_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, CUSTOM_ROLLUP, UNARY_OPERATOR, KEY0 ON 1 
FROM 
(SELECT ({{[Date].[Calendar Year].&[2007], [Date].[Calendar Year].&[2008]}}) on COLUMNS FROM [Adventure Works]) 
CELL PROPERTIES BACK_COLOR, CELL_ORDINAL, FORE_COLOR, FONT_NAME, FONT_SIZE, FONT_FLAGS, FORMAT_STRING, VALUE, FORMATTED_VALUE, UPDATEABLE, ACTION_TYPE