实体关联起来查询可以不通过关系(Lookup字段)吗()

书到用时方恨少,事非经过不知难。这篇文章主要讲述实体关联起来查询可以不通过关系(Lookup字段)吗?相关的知识,希望能为你提供帮助。
我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复456或者20210926可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
如果实体之间有关系,比如1:N或者N:1或者N:N是可以方便的通过高级查找构造出来关联来做查询的。举个简单例子,Contact实体上有个Company Name的字段是Lookup到Account实体的,那么我们查询的主实体虽然是Account,还是可以比较方便的关联Contact实体来做查询。比如要找出这些特征的Account实体,只要他的任何一个Contact的Address 1: City  等于  衡阳就行,我可以通过高级查找界面轻松的构造如下的查询出来:

实体关联起来查询可以不通过关系(Lookup字段)吗()

文章图片



下载下来的FetchXml如下:


< fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
< entity name="account">
< attribute name="name" />
< attribute name="primarycontactid" />
< attribute name="telephone1" />
< attribute name="accountid" />
< order attribute="name" descending="false" />
< link-entity name="contact" from="parentcustomerid" to="accountid" link-type="inner" alias="ad">
< filter type="and">
< condition attribute="address1_city" operator="eq" value="https://www.songbingjia.com/android/衡阳" />
< /filter>
< /link-entity>
< /entity>
< /fetch>



我相信很多人有过疑问,如果两个实体之间不是通过这种关系(通过Lookup字段建立关系或者手动建立N:N关系)的话可以关联起来查询吗?以前我以为也不行,实际上是可以的。
我拿这个例子来说。我想查出来Address 1: City为湖南省下面城市的Accounts,我的行政区域信息是存在名称为【行政区域】的自定义实体中的,与Account实体并无关联,这样一个查询可以查出来吗?答案是可以的,我先构造一个针对【行政区域】实体的高级查询,它查询出来湖南省下面的城市,截图如下:
实体关联起来查询可以不通过关系(Lookup字段)吗()

文章图片



下载下来的FetchXml如下:


< fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
< entity name="ly_district">
< attribute name="ly_districtid" />
< attribute name="ly_name" />
< attribute name="createdon" />
< order attribute="ly_name" descending="false" />
< filter type="and">
< condition attribute="ly_parentdistrictid" operator="eq" uiname="湖南省" uitype="ly_district" value="https://www.songbingjia.com/android/{5972B46E-C11A-EC11-B6E7-002248173C14}" />
< condition attribute="statecode" operator="eq" value="https://www.songbingjia.com/android/0" />
< condition attribute="ly_districtlevel" operator="eq" value="https://www.songbingjia.com/android/364750002" />
< /filter>
< /entity>
< /fetch>

?
下面我就构造一个FetchXml,如下:
可以看到我将contact实体和ly_district实体关联起来了,from属性设置的是关联的link-entity实体的字段,to属性设置的值则是link-entity父级元素实体中的字段,这两个字段都是单行文本字段。
?
< fetch version=\'1.0\' output-format=\'xml-platform\' mapping=\'logical\' distinct=\'true\'>
< entity name=\'account\'>
< attribute name=\'name\' />
< attribute name=\'primarycontactid\' />
< attribute name=\'telephone1\' />
< attribute name=\'accountid\' />
< order attribute=\'name\' descending=\'false\' />
< link-entity name=\'contact\' from=\'parentcustomerid\' to=\'accountid\' link-type=\'inner\' alias=\'con\'>
< link-entity name=\'ly_district\' from=\'ly_name\' to=\'address1_city\' link-type=\'inner\' alias=\'dis\'>
< filter type=\'and\'>
< condition attribute=\'ly_parentdistrictid\' operator=\'eq\' value=https://www.songbingjia.com/'5972B46E-C11A-EC11-B6E7-002248173C14\' />
< condition attribute=\'statecode\' operator=\'eq\' value=https://www.songbingjia.com/'0\' />
< condition attribute=\'ly_districtlevel\' operator=\'eq\' value=https://www.songbingjia.com/'364750002\' />
< /filter>
< /link-entity>
< /link-entity>
< /entity>
< /fetch>



我用FetchXml Tester进行测试是可以看到有记录返回的,结果也是正确的。
实体关联起来查询可以不通过关系(Lookup字段)吗()

文章图片



那么其他类型字段呢?估计大部分也可以,如果大家在项目实践中碰到不能用来做实体关联的字段类型欢迎告诉我,我再更新本文。
【实体关联起来查询可以不通过关系(Lookup字段)吗()】这个特性的好处就是以后两个实体之间建立关系可以用其他类型字段,比如文本字段,而不一定要用查找字段或者手工建立N:N关系了,查找类型字段还算是个比较复杂的字段,使用文本字段替代在某些场景下是好用的.只是使用高级查找界面不能完全构造出来FetchXml,需要手工修改生成的半成品FetchXml.

    推荐阅读