2011-09-15 12 views
5

私はCRM2011 SDKを使用するために、私のCRM4.0プラグインのいくつかを変換してきました。私はアーリーバウンドのエンティティのためにLINQを使い始めたばかりで、問題を見つけました。CRM 2011 - 参加したエンティティからFormattedValuesを取得する

私は結合されたエンティティでOptionSetValueのフォーマットされた値を取得しようとしています。 this MSDN SDK Query Exampleを見て、私はプライマリエンティティのフォーマットされた値を取得することができましたが、それを結合したエンティティに変換することはできません。

以下のコードは、私が達成しようとしているもののサンプルです。私は、SDKの例のコードを使用して始めました。遭遇

var query_join8 = (from a in sContext.AccountSet 
        join c in sContext.ContactSet 
         on a.PrimaryContactId.Id equals c.ContactId 
         into gr 
        from c_joined in gr.DefaultIfEmpty() 
        select new 
           { 
            contact_name = c_joined.FullName, 
            account_name = a.Name, 
            account_addresstypecode = a.Address1_AddressTypeCode, 
            account_addresstypename = a.FormattedValues.ContainsKey("address1_addresstypecode") ? a.FormattedValues["address1_addresstypecode"] : null, 
            account_formattedValues = a.FormattedValues, 
            contact_addresstypecode = c_joined.Address1_AddressTypeCode, 
            contact_addresstypename = c_joined.FormattedValues.ContainsKey("address1_addresstypecode") ? c_joined.FormattedValues["address1_addresstypecode"] : null, 
            contact_formattedValues = c_joined.FormattedValues, 
           }).ToArray(); 

account_formattedValuesとaccount_addresstypenameを修正し、私はそのデータへのアクセス権を持っていますが、何らかの理由でcontact_formattedValues項目が空のコレクションが含まれているため、contact_addresstypenameがnullです。

私はこれを間違って行っているのですか、何か逃しましたか?誰かがこれを達成する方法を知ることができましたか?どんな助けでも大歓迎です。

答えて

8

LINQクエリプロバイダには、最初のエンティティに続くエンティティに書式設定された値が正しく適用されないバグがあります。これは、(LINQプロバイダが使用する)QueryExpression APIが結合クエリを処理する方法に関連しています。これは、すべての属性とフォーマットされた値を最初の/プライマリエンティティ(技術的には唯一のエンティティ)にプールすることによって行われます。次に、 "link aliases"のセットを使用してこれらの値を分類します。これは、欠落しているFormattedValuesの回避策として利用できます。

var acs = 
    from a in context.AccountSet 
    join c in context.ContactSet on a.PrimaryContactId.Id equals c.ContactId 
    into gr 
    from c_joined in gr.DefaultIfEmpty() 
    select new 
    { 
     account_addresstypecode = a.Address1_AddressTypeCode, 
     account_addresstypename = a.FormattedValues["address1_addresstypecode"], 
     contact_addresstypecode = c_joined.Address1_AddressTypeCode, 
     contact_addresstypename = a.FormattedValues["c_0.address1_addresstypecode"], 
     a.FormattedValues 
    }; 

foreach (var ac in acs) 
{ 
    foreach (var pair in ac.FormattedValues) 
    { 
     Console.WriteLine("{0} {1}", pair.Key, pair.Value); 
    } 
} 

すべてのラベル値は「」パラメータから引っ張られるお知らせ、トリッキーな部分はに基づいて動的に作成された文字列である(非プライマリエンティティのための)エイリアス/プレフィックス値が何であるかを知っていますエンティティセットパラメータの名前、「c」、およびカウンタ値を含む。これは、プライマリエンティティのFormattedValuesをダンプすることによって調べることができます。

+0

優秀、これは私のために働いています! –

関連する問題