我正在尝试仅检索自上次元数据查询以来已更改元数据的特定实体的属性 - 例如:如果用户更改某个实体的某个字段的要求,并保存并发布此更改,我想要一个插入消息的插件发布& PublishAll让我知道该属性的属性和元数据已更改。
这是我到目前为止的代码,基于MSDN上的这个示例:https://msdn.microsoft.com/en-us/library/jj863605.aspx?f=255&MSPPError=-2147217396
我得到了includedEntities
中列出的三个实体的属性,所以没问题。
我获得了RequiredLevel和IsValidForAdvancedSearch的值,attributeProperties
中列出的两个属性属性以及我想要观看的属性,而其余属性返回null,所以再次,这里没问题。
attributeFilter也做了它应该做的事情:我只获得数据字段(不描述其他属性的属性),所以再一次:没问题。
我传递的clientversionstamp是从我创建的配置参数中检索的,我在每次查询后都会更新。通过在调试期间观察它,我知道它是正确的值 - 所以我很确定这也不是问题。
那么问题是什么?对于每个实体,我仍然有一些(大约一半)属性被添加到响应中已更改属性的集合中,尽管我没有更改任何内容。
如果我确实更改了元数据中的某些内容,那么该属性也会添加到响应集合中,因此我的代码确实会接收更改。但是,我仍然获得了比我想要的更多的数据 - 目标是只获得一个已经改变的属性。我错过了什么?
MetadataFilterExpression EntityFilter = new MetadataFilterExpression(LogicalOperator.And);
EntityFilter.Conditions.Add(new MetadataConditionExpression("LogicalName", MetadataConditionOperator.In, includedEntities));
MetadataPropertiesExpression EntityProperties = new MetadataPropertiesExpression()
{
AllProperties = false
};
EntityProperties.PropertyNames.AddRange(new string[] { "Attributes" });
MetadataConditionExpression optionsetAttributeName = new MetadataConditionExpression("AttributeOf", MetadataConditionOperator.Equals, null);
MetadataFilterExpression AttributeFilter = new MetadataFilterExpression(LogicalOperator.And);
AttributeFilter.Conditions.Add(optionsetAttributeName);
MetadataPropertiesExpression AttributeProperties = new MetadataPropertiesExpression() { AllProperties = false };
foreach (string attrProperty in attributeProperties)
{
AttributeProperties.PropertyNames.Add(attrProperty);
}
EntityQueryExpression entityQueryExpression = new EntityQueryExpression()
{
Criteria = EntityFilter,
Properties = EntityProperties,
AttributeQuery = new AttributeQueryExpression()
{
Properties = AttributeProperties,
Criteria = AttributeFilter
}
};
RetrieveMetadataChangesRequest req = new RetrieveMetadataChangesRequest()
{
Query = entityQueryExpression,
ClientVersionStamp = clientVersionStamp
};
return (RetrieveMetadataChangesResponse)service.Execute(req);