5

CRM4.0プラグインの一部をCRM2011SDKを使用するように変換しています。LINQ for Early-Boundエンティティを使い始めたばかりで、問題が発生しました。

結合されたエンティティでOptionSetValueのフォーマットされた値を取得しようとしています。このMSDNSDKクエリの例を見た後、プライマリエンティティのフォーマットされた値を取得できましたが、それを結合されたエンティティに変換できないようです。

以下のコードは、私が達成しようとしていることのサンプルです。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です。

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

4

1 に答える 1

8

LINQ クエリ プロバイダーには、最初のエンティティに続くエンティティに書式設定された値が適切に適用されないというバグがあります。これは、(LINQ プロバイダーが使用する) QueryExpression API が結合クエリを処理する方法に関連しています。これは、すべての属性と書式設定された値を最初の/プライマリ エンティティ (技術的には唯一のエンティティ) にプールすることによって行われます。次に、一連の「リンク エイリアス」を使用して、これらの値を分類します。不足している 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);
    }
}

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

于 2011-11-15T16:56:20.460 に答える