6

マーケティングリストのリストを取得しています。そうしていると、インテリセンスを使用したチェックによると、正常に動作しているようです。私が探すとき、...Entities[0].Attributes["nick"]私はオブジェクトを取得します(その中に正しいデータがあります)。しかし、プログラムでアクセスすることはできません(代わりに、プラスを介してサルのようにクリックして、良いものを展開する必要があります)。

実際、私は以下のコードを使用することになっているエンティティを取得しています。問題は、それらがStringsコンピューターによるものではないということです。それらはタイプMicrosoft.Xrm.Sdk.AliasedValueであり、それらの中の実際のニックにアクセスする方法がわかりません。

new Contact
{
  Name = element.Attributes["nick"] as String,
  Mail = element.Attributes["mail"] as String
}

IntellisenseはそれValueがそこにあると言います(そしてそれも正しい値です)が、私はそれを入力してアクセスすることはできません.Value。「as」などを使う必要があるのではないかと思いますが、今は行き詰まっています。ヒントはありますか?As動作するStringはずの、にそれを行うと、私にnull...

私はこの記事とそれが好きな他のいくつかの記事を読みました、そして私がそれを見る方法で、私はそこにあるすべての楽しいものにアクセスできるはずです。できません...

次のコードは、私が必死に取得しようとしているデータを取得することに気づきましたが、これはプロの構文ではありませんね。真剣に、それはADHDと二日酔いの高校生がそれをやろうとしたようです...

new Contact
{
  Name = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["nick"]).Value,
  Mail = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["mail"]).Value
}

つまり、真剣に-これは1つの醜いコードです...もっと良い方法が必要です!しかし、この議論でもその構文を使用しているように見えるので、そうではないのではないかと心配しています...

4

3 に答える 3

7

ドキュメントを見ると、オブジェクトのAttributesプロパティは、から派生したタイプです。EntityAttributeCollectionDataCollection<string,Object>

コレクション内の属性ごとに、キーと値のペアがあります。

したがって、各キー( "nick"、 "mail")には、対応するがありobject、これは任意の.NETタイプである可能性があります。探しているプロパティにアクセスするには、オブジェクトを正しいタイプにキャストする必要があります(または、リフレクションを使用する必要があります。これは確かに醜いです。C#4.0ではタイプdynamic思いますが、場合、コンパイル時のチェックが失われます); string属性がタイプ/// Money/ etcであるintかどうかをコンパイラが他にどのように判断できるでしょうAliasedValueか?

についてAliasedValueは、CRMはこのタイプを使用して戻り値に関する追加情報を格納します。また、任意の属性にエイリアスを設定できるため、プロパティは任意のValueタイプ( 、、、、、など)にすることができます。この場合、プロパティも適切にタイプであるため、戻り値に関する追加情報を取得するには、これもキャストする必要があります。OptionSetValuedecimalstringGuidEntityReferenceValueobject

したがって、キャストを回避する方法はありませんが、ファイルの先頭にステートメントを追加し、に割り当てる前にusingそれぞれの値を定義することで、コードを短く、おそらくよりクリーンにすることができます。とにかく、各タイプのデータ検索の例を1つ含めました。プロジェクトでどちらが優れているかを判断できます。AliasedValueContact

キャスティングの使用:

using Microsoft.Xrm.Sdk;

...

var nick = (AliasedValue)result.Entities[0].Attributes["nick"];
var mail = (AliasedValue)result.Entities[0].Attributes["mail"];

var contact = new Contact
{
    Name = nick.Value, //Value is of type object; cast again for a more specific type
    Mail = mail.Value
};

リフレクションの使用:

var nick = result.Entities[0].Attributes["nick"]
    .GetType()
    .GetProperty("Value")
    .GetValue(result.Entities[0].Attributes["nick"], null);
var mail = result.Entities[0].Attributes["mail"]
    .GetType()
    .GetProperty("Value")
    .GetValue(result.Entities[0].Attributes["mail"], null);

var contact = new Contact
{
    Name = nick,
    Mail = mail
};

動的な使用:

dynamic nick = result.Entities[0].Attributes["nick"];
dynamic mail = result.Entities[0].Attributes["mail"];

var contact = new Contact
{
    Name = nick.Value, //dynamic figures out the right property at runtime
    Mail = mail.Value
};
于 2012-09-28T22:21:28.820 に答える
1

私はあなたがこのようなものが欲しかったと思います:

 //Get Account PrimaryContact details
        public static void GetAccountPrimaryContactDetails(Guid accountId, IOrganizationService orgService)
        {
            var contactFirstName = default(object);
            var contactLastName = default(object);
            var contactFullName = default(object);

            string fetchXML = string.Format(@"<fetch version='1.0' output-format='xml-platform' no-lock='true' mapping='logical'>
                                    <entity name='account'>
                                        <attribute name='name' />                                                                                
                                        <filter type='and'>
                                            <condition attribute='statuscode' operator='eq' value='1' />                                            
                                            <condition attribute='accountid' operator='eq' value='{0}' />
                                        </filter>                                        
                                        <link-entity name='contact' from='contactid' to='primarycontactid' alias='ab'>
                                             <attribute name='fullname' alias='as_fullname' />
                                             <attribute name='firstname' alias='as_firstname' />                                             
                                             <attribute name='lastname' alias='as_lastname' />
                                        </link-entity>
                                    </entity>
                                </fetch>", accountId.ToString());

            var fetchExp = new FetchExpression(fetchXML);

            EntityCollection accountEntity = orgService.RetrieveMultiple(fetchExp);

            if (accountEntity.Entities.Count > 0)
            {
                //Primary Contact Fullname
                AliasedValue avContactFullname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_fullname");
                if (avContactFullname != null)
                    contactFullName = avContactFullname.Value;
                //Primary Contact Firstname
                AliasedValue avContactFirstname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_firstname");
                if (avContactFirstname != null)
                    contactFirstName = avContactFirstname.Value;
                //Primary Contact Lastname
                AliasedValue avContactLastname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_lastname");
                if (avContactLastname != null)
                    contactLastName = avContactLastname.Value;
于 2018-04-18T14:25:00.157 に答える
0

エイリアス値のチェックを処理するGetValueヘルパー関数が定義されています

public static T GetValue<T>(this Entity entity, string attributeName)
{
     if (entity.Attributes.ContainsKey(attributeName))
    {
        var attr = entity[attributeName];
        if (attr is AliasedValue)
        {
            return GetAliasedValueValue<T>(entity, attributeName);
        }
        else
        {
            return entity.GetAttributeValue<T>(attributeName);
        }
    }
    else
    {
        return default(T);
    }

}

これは、内部の追加ヘルパーメソッドを使用して、エイリアスフィールド値を取得します

private static T GetAliasedValueValue<T>(this Entity entity, string attributeName)
        {
            var attr = entity.GetAttributeValue<AliasedValue>(attributeName);
            if (attr != null)
            {
                return (T)attr.Value;
            }
            else
            {
                return default(T);
            }

        }

これはEntityクラスの拡張メソッドとして定義されているため、SDKが提供するGetAttributeValueと同じように使用できます。エイリアスフィールド名を使用することを忘れないでください。

var myValue = myEntity.GetValue<string>("alias.fieldname")
于 2018-04-20T15:54:51.443 に答える