|
09.07.2009, 20:40 | #1 |
Участник
|
Преобразование Key->Guid
Для получения выборки ссылочной сущности (отношение N:1) по списку Id основной сущности в запрос нужно передавать эти Id в виде Guid-ов. Guid-ы извлекаются из выборки записей основной сущности, где они содержаться в атрибуте первичного ключа (PK). Это атрибут имеет тип Microsoft.Crm.Sdk.Key и напрямую в Guid никак не хочет преобразовываться. Пришлось применитть 2-х шаговое преобразование с использованием промежуточных переменных:
Код: ce = new ConditionExpression(); ce.AttributeName = "new_primaryobjectreference"; ce.Operator = ConditionOperator.In; ce.Values = new Object[result.BusinessEntityCollection.BusinessEntities.Count]; Key dekey; Guid deid = new Guid(); for (int i = 0; i < result.BusinessEntityCollection.BusinessEntities.Count; i++) { de = (DynamicEntity)result.BusinessEntityCollection.BusinessEntities[i]; dekey = de.Properties["new_primaryobjectid"] as Key; deid = dekey.Value; ce.Values[i] = deid; } В начале я вообще не думал, что нужно будет делать какие-либо преобразования. Для передачи значений создал универсальный массив generic-объектов, в который просто сохранял список ключей. Но при выполении запроса CRM ругался: "ты подсунул Key туда где нужен Guid" и пришлось искать способ привести значения к нужному типу. |
|
09.07.2009, 21:54 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от alsherin
Для получения выборки ссылочной сущности (отношение N:1) по списку Id основной сущности в запрос нужно передавать эти Id в виде Guid-ов. Guid-ы извлекаются из выборки записей основной сущности, где они содержаться в атрибуте первичного ключа (PK). Это атрибут имеет тип Microsoft.Crm.Sdk.Key и напрямую в Guid никак не хочет преобразовываться. Пришлось применитть 2-х шаговое преобразование с использованием промежуточных переменных:
Код: ce = new ConditionExpression(); ce.AttributeName = "new_primaryobjectreference"; ce.Operator = ConditionOperator.In; ce.Values = new Object[result.BusinessEntityCollection.BusinessEntities.Count]; Key dekey; Guid deid = new Guid(); for (int i = 0; i < result.BusinessEntityCollection.BusinessEntities.Count; i++) { de = (DynamicEntity)result.BusinessEntityCollection.BusinessEntities[i]; dekey = de.Properties["new_primaryobjectid"] as Key; deid = dekey.Value; ce.Values[i] = deid; } В начале я вообще не думал, что нужно будет делать какие-либо преобразования. Для передачи значений создал универсальный массив generic-объектов, в который просто сохранял список ключей. Но при выполении запроса CRM ругался: "ты подсунул Key туда где нужен Guid" и пришлось искать способ привести значения к нужному типу.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
10.07.2009, 13:38 | #3 |
Участник
|
Вот такая штука возвращает GUID:
Код: ((Key)DynamicEntity.Properties["new_primaryobjectid"]).Value
__________________
С уважением, Tony Green |
|
|
За это сообщение автора поблагодарили: alsherin (1). |
10.07.2009, 15:21 | #4 |
Участник
|
С точки зрения производительности какой код эффективнее? Можно ли было сразу написать:
Код: ce.Values[i] = ((Key)((DynamicEntity)result.BusinessEntityCollection.BusinessEntities[i]).Properties["new_primaryobjectid"]).Value; |
|
10.07.2009, 15:25 | #5 |
Moderator
|
Не важно. Компилятор все равно оптимизирует код за вас. Пишите так, как удобно отлаживать и вносить изменения.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: alsherin (1). |
|
|