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

Dar*_*ryl 5 c# c#-4.0 dynamics-crm-2011

我发现CRM SDK如何通过OptionSetValue属性处理实体搜索,并创建具有OptionSetValue属性的实体.

背景:

我有一个带有此签名的方法

GetOrCreateEntity<T>(IOrganizationService service, params object[] columnNameAndValuePairs)
Run Code Online (Sandbox Code Playgroud)

其中columnNameAndValuePairs是一个看起来像这样的对的列表:(列的字符串名称,列的值)ie."name","John Doe"转到entity.name ="John Doe".

它可以像这样使用:

var user = GetOrCreateEntity<SystemUser>("username", "jdoe");
Run Code Online (Sandbox Code Playgroud)

这将使用用户名jdoe为SystemUser实体创建和执行查询表达式.如果找不到,则会创建一个,用"jdoe"填充username属性,然后创建对象.

问题:

这在大多数情况下都很有效,除非我正在搜索/创建OptionSetValue属性.所以说出这样的话:

var user = GetOrCreateEntity<SystemUser>("username", "jdoe", "Sex", new OptionSetValue(1));
var user = GetOrCreateEntity<SystemUser>("username", "jdoe", "Sex", 1);
Run Code Online (Sandbox Code Playgroud)

如果我传入OptionSetValue(1)查询表达式搜索失败,但如果我传入1查询表达式执行没有错误,但service.Create(entity)失败因为它期望一个OptionSetValue.

我很容易检查一个OptionSetValue值,并将int值发送到QueryExpression中,但我只是想确保我没有做错.Microsoft是否真的希望您创建将该属性填充为OptionSetValue但将其作为int进行搜索的实体?

Joh*_*ven 2

我不能代表微软发言,但这听起来/看起来是正确的。可能需要注意的是,您使用 FetchXml 或 QueryExpression 进行搜索,它们具有与用于创建/更新的 DynamicEntity (CRM 4) 或仅实体(在 CRM 2011 中)不同的架构。

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