为什么在搜索具有OptionSetValue属性的实体时必须使用int,但在创建实体时使用OptionSetValue对象?

时间:2012-01-16 15:47:22

标签: c# c#-4.0 dynamics-crm-2011

我发现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进行搜索的实体?

1 个答案:

答案 0 :(得分:2)

我不能代表微软发言,但这听起来似乎正确。值得注意的是,您可以使用FetchXml或QueryExpression进行搜索,这些模式具有来自DynamicEntity(CRM 4)或仅用于创建/更新的Entity(在CRM 2011中)的不同模式。

即使在CRM 4中,CRM具有常见类型(CrmBoolean,CrmNumber)的wappers,您也必须通过CLR类型进行查询,但使用包装器进行创建/更新。另请注意,EntityReference是相同的方案。您可以通过Guid进行搜索,但必须使用EntityReference创建/更新。