我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复455或者20210921可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
我们做项目中有时候用到层级数据,比较常见的比如行政区划,员工,产品BOM之类的,常用的Account实体自带了一个名称为 Account Hierarchy 的Hierarchy Setting。我们今天来看看如何定义,展示效果和查询,参考的官方文档包括但不限于如下:
Query and visualize hierarchically related data
Define and query hierarchically related data
Query hierarchical data
为了方便演示效果,我建立一个行政区域实体,其中一个字段是Lookup字段到本实体,如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwATMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5IDZwMGOhlTO1MWNhdjZ0IjN0cTY5I2M2ATN4ImM5QGO5QTN0EzLclDMxIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
然后我们到 Hierarchy Settings 里面区新建一个Hierarchy Setting。
新建时候点击 Mark a relationship as enabled for hierarchies. 在弹出窗口中选中要lookup到自己的那个relationship,点击【Mark hierarchical】按钮。
成功后可以看到 【Is Hierarchical?】列的值变成了True,然后我们点击【Done】按钮关闭窗口。
为了更好的展示效果,我造了一些数据,如下:
点击第一列的层级图标,我展开一个效果如下所示:
然后我们来看下如何查询下级,我举个例子,我想查询湖南省下面所有的行政区划,包括市和县,用高级查找是这样的,我这里加了一个常用的筛选条件Status Equal Active, 也就是statecode eq 0,这是我们做项目时候查询一般要加的筛选,以便充分利用默认的启用/禁用功能。
看到的结果如下,是正确的。
下载下来的这个查询的FetchXml如下,可以看到用的操作符是 under 。
当然,高级查找界面还支持 Not Under。
这个查询结果如下,可以看到将湖南省的上级,湖南省本级和广东省的所有行政区划都查询出来了。
这里下载下来的FetchXml如下:
对于层级数据查询,虽然高级查找界面只支持Under和Not Under两个操作符,如果用编程的方式来查询的话可以支持更多,主要是额外支持above、eq-or-above、eq-or-under、eq-useroruserhierarchy、eq-useroruserhierarchyandteams,官方文档解释如下,我就不一一演示了,用到时候自己测试下自然明白。
可以看到用这些查询操作符可以一次查询出相关数据,不用递归进行查询,方便很多。
CONDITION OPERATORS FOR HIERARCHICAL DATA
<col>
FetchXML
ConditionOperator
Description
<code>above</code>
<code>Above</code>
Returns all records in referenced record's hierarchical ancestry line.
<code>eq-or-above</code>
<code>AboveOrEqual</code>
Returns the referenced record and all records above it in the hierarchy.
<code>under</code>
<code>Under</code>
Returns all child records below the referenced record in the hierarchy
<code>eq-or-under</code>
<code>UnderOrEqual</code>
Returns the referenced record and all child records below it in the hierarchy
<code>not-under</code>
<code>NotUnder</code>
Returns all records not below the referenced record in the hierarchy
<code>eq-useroruserhierarchy</code>
<code>OwnedByMeOrMyReports</code>
When hierarchical security models are used, Equals current user or user's reporting hierarchy
<code>eq-useroruserhierarchyandteams</code>
<code>OwnedByMeOrMyReportsAndTeams</code>
When hierarchical security models are used, Equals current user and user's teams, or user's reporting hierarchy and their teams