4

我是 CRM 开发的新手。我想从我的 C# 应用程序更新自定义字段值,以及 CRM 2011 中的现有值。如果该字段有一些值,那么它工作正常,但如果它为空,那么我收到“字典中不存在给定的键”。错误。

下面的代码是我想要实现的。

IOrganizationService service = (IOrganizationService)serviceProxy;
QueryByAttribute querybyattribute = new QueryByAttribute("salesorder");
querybyattribute.ColumnSet = new ColumnSet(new String[] {
  "salesorderid", "new_customefield" });

querybyattribute.Attributes.AddRange("ordernumber");
querybyattribute.Values.AddRange(ordernumber);
EntityCollection retrieved = service.RetrieveMultiple(querybyattribute);

foreach (var c in retrieved.Entities)
{
  OrderID = new Guid(c.Attributes["salesorderid"].ToString());
  CustomFieldValue = c.Attributes["new_customefield"].ToString();
}
4

1 回答 1

4

发生错误是因为没有输入值的字段不会在上下文对象而不是图像中返回。或者说得通俗一点——你需要检查一个字段是否在属性中。

通过ColumnSet声明并请求它是不够的。这令人困惑和烦人(我自己去过那里)。

就在我的脑海中,我可以想到下面的代码片段来管理这个问题(不必为每次读取设置一个if子句,但也避免了一堆方法 - 每个变量类型一个)。

private Generic GetEntityValue<Generic>(
  Entity entity, String field, Generic substitute = default(Generic))
{
  if (entity.Contains(field))
    return (Generic)entity[field];
  return substitute;
}

编辑:或作为扩展方法

public static T GetAttributeValue<T> (this Entity e, string propertyName, T defaultValue = default(T))
{
    if (e.Contains(propertyName))
    {
        return (T)e[propertyName];
    }
    else
    {
        return defaultValue;
    }
}
于 2013-02-26T12:19:04.397 回答