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 основного объекта.