参与过Dynamics CRM相关工作的朋友们都知道,Dynamics 365之前并没有多选域字段,想要实现多选域,需要自己添加WebResource定制,而这也带来了一系列需要考虑的情况,比如额外的字段消耗,逻辑上复杂的转换规则等,更有甚者,会去改变涉及多选域情况的业务逻辑。但随着Dynamics 365 V9版本的发布,多选域的问题将不再复杂(针对简单的需求),因为MS终于把多选域字段添加了进来。
1. 添加多选域字段
与新建OptionSet的方式没有区别,选择字段类型“MultiSelect Option Set”,也可以创建一个Global Multiple Select Option Set
在创建完之后,我们把它Publish到Form上,来看看具体的选择效果是什么样的
- 支持全选/反全选
- 支持搜索,是包含的查询结果
- “4 items”显示的是查询的结果数目,默认是所有
- 可以通过点击“x”来去掉选项
2. Advanced Find
既然这是一个字段,那么当然可以通过Advanced Find查询,对比以前的规则条件,多选域多了两个规则:“Contains Values”,"Does Not Contains Values"
那么FetchXml也相应的有所改变
1 <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> 2 <entity name="account"> 3 <attribute name="name" /> 4 <attribute name="primarycontactid" /> 5 <attribute name="telephone1" /> 6 <attribute name="accountid" /> 7 <order attribute="name" descending="false" /> 8 <filter type="and"> 9 <condition attribute="new_multiselect" operator="contain-values"> 10 <value>100000000</value> 11 </condition> 12 <condition attribute="new_multiselect" operator="not-contain-values"> 13 <value>100000001</value> 14 </condition> 15 <condition attribute="new_multiselect" operator="in"> 16 <value>100000000</value> 17 <value>100000002</value> 18 </condition> 19 </filter> 20 </entity> 21 </fetch>
3. API调用
如果想执行多选域相关的操作,比如查询结果,这里需要引用最新版本的dll。在V9版本之后,MS将不再像以前那样提供SDK的下载包,Assembly直接通过Nuget添加,具体的名字:Microsoft.CrmSdk.CoreAssemblies。里面包含了需要用到的Microsoft.Xrm.Sdk.dll和Microsoft.Crm.Sdk.Proxy.dll
接着我们看看多选域字段值到底是什么样的。
多选域字段的值是一个集合:OptionSetValueCollection,每一个被选中的选项是一个OptionSetValue对象。
并且像OptionSet一样,FormattedValues里可以得到所有被选中选项的Label值,但是这里需要注意一点,Label值是用“;”分号隔开,而且除了第一个值之外,后续的值的前面都会有个空格,在进行数据操作前,需要把空格去掉。
再提醒一下,这里需要用到V9版本及以后的dll,不然多选域字段的Value都是空。
之前说到Operation有更新,那么对应于Advanced Find里面的情况,API中的Operator值分别是ConditionOperator.ContainValues和ConditionOperator.DoesNotContainValues。