QuoteDetail(SalesOrderDetailとOpportunityProductのような)は、Catalog ProductアイテムまたはWrite-Inアイテムとの関連エンティティであり、productidname
(カタログからの製品)またはproductdescription
(write-製品内)。その名前を取得するには、関連する製品に参加する必要があります。
一般的なソリューション/インターフェイスを開発しようとしている場合、これはすべてのLookup属性に対処する必要がある問題です。
あなただけのこれまでのルックアップで接続記録からPrimaryNameAttributeが必要な場合は、あなたがあなたの「メイン」実体のFormattedValues
コレクションから名前を取得することができます。より安全/まだ良く
string productname = quotedetail.FormattedValues["productid"];
:
string productname;
quotedetail.FormattedValues.TryGetValue("productid", out productname);
このように見ることができ、任意のエンティティの
取り扱い属性:
foreach (var key in record.Attributes.Keys)
{
if (record.FormattedValues.ContainsKey(key))
{
string formattedvalue;
if (record.FormattedValues.TryGetValue(key, out formattedvalue))
{
Console.WriteLine(formattedvalue); // use formattedvalue string
}
continue; // skip to next field when found in formatted values
}
object attributevalue;
record.Attributes.TryGetValue(key, out attributevalue);
object actualvalue;
string actualtext = string.Empty;
// handle AliasedValue fields from JOINed/LinkEntities
if (attributevalue.GetType().Name == "AliasedValue")
{
actualvalue = ((AliasedValue)attributevalue).Value;
}
else
{
actualvalue = attributevalue;
}
switch (actualvalue.GetType().Name)
{
case "EntityReference":
actualtext = ((EntityReference)actualvalue).Name; // this will catch Lookup values not contained in FormattedValues when you just created them
break;
case "DateTime":
actualtext = string.Format("{0:dd.MM.yyyy}", ((DateTime)actualvalue).ToLocalTime()); // ... any other dateTime format you'd like
break;
case "Guid":
actualtext = string.Format("{0:D}", actualvalue); // Entity Primary key
break;
default:
actualtext = (string)actualvalue; // anything else
break;
}
Console.WriteLine(actualtext);
}
新しく割り当てられたOptionSetValue
とMoney
の属性(EntityReference
のものに似ています)は、通常FormattedValues
から引き出されるので、引き続き注意する必要があります。
この例では既存のcrmデータを扱うので、実際にはすべての属性が含まれていないという落とし穴に気づく必要があるため、.Attributes.Keys
を反復するのではなく、定義済みの属性名のコレクションを参照してください。
私の個人的な戦略は、通常、型付きオブジェクトとCRMエンティティの間をマッピングするための軽量なORMを作成することですが、これは汎用インターフェースの要件には合いません。それはどちらかだ、このまたは私は仕事に構文砂糖を入れ、その属性あなたのようなケースについては
:
string pn = qd.GetAttributeValue<string>("productdesription") ?? (qd.GetAttributeValue<EntityReference>("productid") ?? new EntityReference { Name = string.Empty }).Name;
が書き込み製品名を取得してください。 nullの場合はLookup名を取得し、nullの場合は偽のEntityReferenceから空の文字列を取得します。
これは摩擦の少ないコーディングを可能にし、「この属性かその属性」をうまく解決します。
ありがとう、ありがとう。関連エンティティ/フィールドを必要に応じて持ち込むようにコードを指示できる何かがメタデータにありますか?それとも、問題のエンティティをカバーするために私のソリューションにハードコードする必要があるのでしょうか? – Yoni
更新を見ただけです。まもなくそれを試みます。再度、感謝します。 – Yoni
アップデートの例はあなたに一般的な考えを与えるべきです。後で任意の属性を抽出する方法の完全なコード例を追加します。 – Filburt