4

CRM開発初心者です。C# アプリケーションから CRM 2011 の既存の値に加えて、カスタム フィールドの値を更新したいと考えています。フィールドにいくつかの値がある場合は正常に機能していますが、null の場合は「指定されたキーが辞書に存在しませんでした」というメッセージが表示されます。エラー。

以下のコードは、私が達成しようとしているものです。

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句を設定する必要はなく、変数の型ごとに 1 つのメソッドの束を回避することもできません)。

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 に答える