CRM 2011 - получение FormattedValues ​​из присоединенной сущности

Я конвертировал некоторые из моих плагинов CRM4.0 для использования CRM2011 SDK. Я только начинаю работать с LINQ для ранних объектов и столкнулся с проблемой.

Я пытаюсь получить отформатированное значение OptionSetValue в объединенной сущности. Посмотрев на этот пример MSDN SDK Query, мне удалось получить отформатированные значения для основного объекта, но я не могу перевести это в объединенный объект.

Код ниже - пример того, чего я пытаюсь достичь. Я начал с использования кода из примера 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.

Я делаю это неправильно, или я что-то пропустил? Кто-нибудь смог или знает, как этого добиться? Любая помощь с благодарностью.

1 ответ

Решение

В поставщике запросов LINQ есть ошибка, из-за которой отформатированные значения не применяются должным образом к объектам, следующим за первым объектом. Это связано с тем, как API QueryExpression (который использует поставщик LINQ) обрабатывает запросы на соединение. Это достигается путем объединения всех атрибутов и форматированных значений в первом / основном объекте (технически единственный объект). Затем он использует набор " псевдонимов ссылок" для классификации этих значений. Мы можем использовать это как обходной путь к отсутствующим 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". Сложная часть заключается в том, чтобы узнать, каково значение псевдонима / префикса (для неосновных объектов), которое является динамически создаваемой строкой на основе имени параметра набора сущностей., "с" и значение счетчика. Это можно проверить, выгрузив FormattedValues ​​основного объекта.

Другие вопросы по тегам