4

名前空間の作業に 1 年を費やした後、Microsoft.Xrm.Sdk昨日、Entity.FormattedValuesプロパティにエンティティ固有 (つまりローカル) のオプション セット テキストのテキスト値が含まれていることを発見しました。

私が以前にそれを発見しなかった理由は、値を取得するための早期バインド方法がないためです。つまり、値のみを含むentity.new_myOptionSetタイプです。のテキスト値を取得するには、entity.FormattedValues["new_myoptionset"] を呼び出す必要があります。OptionSetValueintstringOptionSetValue

したがって、crmsrvcutil を使用して、ローカル オプション セットのテキスト プロパティを自動生成したいと考えています。つまりEntity.new_myOptionSet、現在のEntity.new_myOptionSetTextように生成されるだけでなく、同様に生成されます。

Microsoft.Crm.Services.Utility.ICodeGenerationServiceを調べましたが、主に何かを指定するためのもののCodeGenerationTypeようです...

CrmServiceUtil を使用してこれらのプロパティを追加するサポートされている方法はありますか、または自動生成されたプロパティの部分クラスとしてこれらのプロパティを生成できる実行可能なカスタム アプリを作成する方がよいでしょうか?

編集 - 生成したいコードの例

現在、OptionSetValue のテキスト値にアクセスする必要があるときはいつでも、次のコードを使用します。

var textValue = OptionSetCache.GetText(service, entity, e => e.New_MyOptionSet);

オプション セット キャッシュはentity.LogicalName、 とプロパティ式を使用して、要求しているオプション セットの名前を決定します。次に、 を使用して SDK にクエリを実行しRetrieveAttriubteRequest、オプション セットの int 値と text 値のリストを取得します。これはキャッシュされるため、CRM に再度アクセスする必要はありません。次に、エンティティの int 値を検索しNew_MyOptionSet、キャッシュされたリストと相互参照して、OptionSet のテキスト値を取得します。

そのすべてを行う代わりに、これを行うことができます (エンティティがクライアント側に入力されただけでなく、サーバーから取得されたと仮定します):

var textValue = entity.FormattedValues["new_myoptionset"];

ただし、「new_myoptionset」は早期バインドではなくなりました。上記の行を呼び出す OptionSetValue プロパティの追加の「テキスト」プロパティも生成するように生成されるアーリー バインドされたエンティティ クラスが欲しいので、私のエンティティにはこれが追加されます。

public string New_MyOptionSetText {
    return this.GetFormattedAttributeValue("new_myoptionset"); // this is a protected method on the Entity class itself...
}
4

3 に答える 3

0

OptionSet の列挙型を生成する CrmServiceUtil 拡張機能を利用して、int 値を列挙型と比較し、列挙型文字列を返す部分クラスに new_myOptionSetText プロパティを追加できますか?

于 2012-11-02T13:10:04.570 に答える
0

CRM Early Bound Generatorの最新バージョンにFieldsは、フィールド名を含む構造体が含まれています。これにより、FormattedValues へのアクセスが次のように簡単になります。

var textValue = entity.FormattedValues[MyEntity.Fields.new_MyOptionSet];

CrmSvcUtil のインターフェイスを介して新しいプロパティを作成することもできますが、これは非常に単純な呼び出しでは大変な作業であり、追加のプロパティを作成することは正当化できないと思います。

于 2016-04-25T17:44:43.623 に答える
0

繰り返しますが、特にこの場合、必要なコードを生成することは素晴らしいアイデアだと思いますが、より一般的には、C# の nameof() 演算子CrmSvcUtil.exeの受け入れられた回答 @ 回避策と同様のアプローチを使用して、リフレクションを介してプロパティ名にアクセスできます。: タイプセーフなデータバインディング

var textValue = entity.FormattedValues["new_myoptionset"];
// becomes
var textValue = entity.FormattedValues
[
    // renamed the class from Nameof to NameOf
    NameOf(Xrm.MyEntity).Property(x => x.new_MyOptionSet).ToLower()
];
于 2012-11-03T16:57:00.183 に答える