我发现CRM SDK如何通过OptionSetValue属性处理实体搜索,并创建具有OptionSetValue属性的实体。
我有一个带有此签名的方法
GetOrCreateEntity<T>(IOrganizationService service, params object[] columnNameAndValuePairs)
其中columnNameAndValuePairs是一个看起来像这样的对的列表:(列的字符串名称,列的值)ie。 “name”,“John Doe”转到entity.name =“John Doe”。
可以像这样使用:
var user = GetOrCreateEntity<SystemUser>("username", "jdoe");
使用用户名jdoe为SystemUser实体创建和执行查询表达式。如果找不到,则会创建一个,用“jdoe”填充username属性,然后创建对象。
除非我正在搜索/创建OptionSetValue属性,否则这在大多数情况下都很有用。所以说出这样的话:
var user = GetOrCreateEntity<SystemUser>("username", "jdoe", "Sex", new OptionSetValue(1));
var user = GetOrCreateEntity<SystemUser>("username", "jdoe", "Sex", 1);
如果我传入OptionSetValue(1)
,查询表达式搜索失败,但如果我传入1
,查询表达式执行时没有错误,但service.Create(entity)
失败,因为它需要一个OptionSetValue。
我很容易检查OptionSetValue值,并将int值发送到QueryExpression中,但我只是想确保我没有做错。 Microsoft是否真的希望您创建将该属性填充为OptionSetValue但将其作为int进行搜索的实体?
答案 0 :(得分:2)
我不能代表微软发言,但这听起来似乎正确。值得注意的是,您可以使用FetchXml或QueryExpression进行搜索,这些模式具有来自DynamicEntity(CRM 4)或仅用于创建/更新的Entity(在CRM 2011中)的不同模式。
即使在CRM 4中,CRM具有常见类型(CrmBoolean,CrmNumber)的wappers,您也必须通过CLR类型进行查询,但使用包装器进行创建/更新。另请注意,EntityReference是相同的方案。您可以通过Guid进行搜索,但必须使用EntityReference创建/更新。