首页 > 解决方案 > Percolator 分析服务在 mdx 查询(LINQ to mdx)中的多个 where 条件

问题描述

我正在尝试在以下 linq 查询上应用多个 where 条件:

            using (var _DB = new MyDB())
        {
                   var QryYear = from model in _DB.DL
                          where model.BusinessDate.BusinessDate.Years["2016"]
                          where model.BusinessDate.BusinessDate.Years["2017"]
                          where model.NumL.Num[FirstNumber].Function("Lag(2)") | model.NumL.Num[SecoundNumber]
                          select new MdxQuery
                          { OnColumns = model.Amount };
            result = QryYear.Percolate<AmountModel>().ToList();

但我得到了这个异常({“Query (13, 1) The BusinessDate hierarchy is used more than once in the Crossjoin function.”})这是查询在 mdx 中的样子:

SELECT{Measures.[Amount]} ON 0
 //----------             From / SubCube               ----------
 FROM [DL]
//----------                 Slicers                  ----------
WHERE
([BusinessDate].[BusinessDate].[Years].[2016],  [BusinessDate].[BusinessDate]. 
[Years].[2017]
,   ([DL].[Num].[55].Lag(2) : [DL].[Num].[2305]))} 

渗滤器分析服务 github

标签: c#sqllinqmdxcube

解决方案


MDX 中的大括号 () 表示元组或交叉连接,您在 WHERE 子句中使用大括号。尝试通过在它们周围放置花括号将两个指定的年份组合成一个集合:

SELECT{Measures.[Amount]} ON 0
 //----------             From / SubCube               ----------
 FROM [DL]
//----------                 Slicers                  ----------
WHERE
(
{[BusinessDate].[BusinessDate].[Years].[2016],  
[BusinessDate].[BusinessDate]. [Years].[2017]
}
,   ([DL].[Num].[55].Lag(2) : [DL].[Num].[2305]))

笔记

只是为了确认。以下MDX是有效的:

SELECT 
    NON EMPTY [Measures].[Internet Sales Amount] ON 0,
    NON EMPTY [Date].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works];

它返回这个:

在此处输入图像描述

但是,如果我们将 2 年成员移动到 WHERE 子句,就像您的脚本一样,那么它不是有效的 MDX:

SELECT 
    NON EMPTY [Measures].[Internet Sales Amount] ON 0
FROM [Adventure Works]
WHERE ([Date].[Calendar Year].&[2005], [Date].[Calendar Year].&[2006]);

异常消息:

执行查询 ... 查询 (4, 1) 在 Crossjoin 函数中不止一次使用 Calendar Year 层次结构。运行完成

但是,如果您按照我的建议添加花括号,那么它是有效的:

SELECT 
    NON EMPTY [Measures].[Internet Sales Amount] ON 0
FROM [Adventure Works]
WHERE ( {[Date].[Calendar Year].&[2005], [Date].[Calendar Year].&[2006]});

结果是

在此处输入图像描述


推荐阅读