CRM 2011 - получение FormattedValues ​​из присоединенной сущности - PullRequest
5 голосов
/ 15 сентября 2011

Я конвертировал некоторые из моих плагинов 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является нулевым.

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

1 Ответ

8 голосов
/ 15 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...