AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.06.2016, 12:39   #1  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
? Пакетной получение всех связей 1:N
Коллеги, приветствую.

Есть следующая задача.
Имеется сущность контакт. У сущности есть несколько связей 1:М. Требуется максимально оптимальное решение (дотнет) для получения всех связанных объектов (гуидов) на текущий момент по этим связям.

Моё решение (три связанных сущности new_sms, new_discountcard, new_order):
Код:
            string fetch = @"
                <fetch count='50' >
                  <entity name='contact' >
                    <filter type='and' >
                      <condition attribute='contactid' operator='eq' value='" + contactSlaveId + @"' />
                    </filter>
                    <link-entity name='new_sms' from='new_contactid' to='contactid' link-type='outer' alias='sms' >
                      <attribute name='new_smsid' />
                    </link-entity>
                    <link-entity name='new_discountcard' from='new_contactid' to='contactid' link-type='outer' alias='card' >
                      <attribute name='new_discountcardid' />
                    </link-entity>
                    <link-entity name='new_order' from='new_contactid' to='contactid' link-type='outer' alias='order' >
                      <attribute name='new_orderid' />
                    </link-entity>
                  </entity>
                </fetch>";
            EntityCollection result = Service.RetrieveMultiple(new FetchExpression(fetch));

            var smsList = result.Entities.Select(x => x.GetAttributeValue<AliasedValue>("sms.new_smsid").Value).Distinct().ToList();
            var cardList = result.Entities.Select(x => x.GetAttributeValue<AliasedValue>("card.new_discountcardid").Value).Distinct().ToList();
            var orderList = result.Entities.Select(x => x.GetAttributeValue<AliasedValue>("order.new_orderid").Value).Distinct().ToList();
Есть ли что-то более быстрое\оптимальное\элегантное (нужное подчеркнуть)?
Старый 16.06.2016, 23:47   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Если честно, то элегантностью ваше решение уж точно не отличается (извините за критику). Если по вашей выборки у контакта будет по 3 связанных записи, то результат составит 27 строк, что как по мне далеко не является идеалом.

Если вам необходимо получить связанные записи по одному контакту, то можно воспользоваться следующим трюком - https://community.dynamics.com/crm/b...etrieve-method

Если этот вариант - не вариант я бы для экономии времени просто разрезал ваши запросы на 3 части (без страшных джоинов) и упаковал бы всё в пакет - https://msdn.microsoft.com/en-us/lib...or=-2147217396
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: magicandy (1).
Старый 17.06.2016, 10:53   #3  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Если честно, то элегантностью ваше решение уж точно не отличается (извините за критику).
Что вы! я ж для критики (конструктивной) вопрос и задал !

Цитата:
Если по вашей выборки у контакта будет по 3 связанных записи, то результат составит 27 строк, что как по мне далеко не является идеалом.
Всё верно. Но тут линк (Distinct) вполне выручает. Хотя предположу, что это будет не самое быстрое решение.

Цитата:
Если вам необходимо получить связанные записи по одному контакту, то можно воспользоваться следующим трюком - https://community.dynamics.com/crm/b...etrieve-method
На сколько я понял это решение, тут возвращают только записи по одной связи (все контакты аккаунта). Я практически не использовал в практике QueryExpression. На мой взгляд Фетч более удобен в плане построения запросов. Но тут на вкус и цвет. Или в один запрос QueryExpression можно упаковать несколько целевых связей?
Я изначально ставил цель получить одним запросом к серверу все результаты, по всем связям.

Цитата:
Если этот вариант - не вариант я бы для экономии времени просто разрезал ваши запросы на 3 части (без страшных джоинов) и упаковал бы всё в пакет - https://msdn.microsoft.com/en-us/lib...or=-2147217396
А вот это очень интересно и ново, никогда не пробовал. Спасибо за ссылочку. Буду пробовать. А как оно по скорости, если сравнить со всеми вариантами выше, включая мой?
Старый 17.06.2016, 19:27   #4  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от magicandy Посмотреть сообщение
Но тут линк (Distinct) вполне выручает
Попробуйте и посмотрите результат именно в такой ситуации как описал я - по несколько связанных по всем связям. По идее гуидов - должно быть по количеству связанных - так оно и будет, только всё будет вперемешку. Декартово произведение называется.

Цитата:
Сообщение от magicandy Посмотреть сообщение
На сколько я понял это решение, тут возвращают только записи по одной связи (все контакты аккаунта).
Можно получать сразу по нескольким. И Fetch тут тоже прекрассно работает потому как можно использовать FetchExpression.

Цитата:
Сообщение от magicandy Посмотреть сообщение
А как оно по скорости, если сравнить со всеми вариантами выше, включая мой?
По поводу сравнения быстродействия - ничего не скажу, не сравнивал, вам и карты в руки.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
guid всех сущностей NoTimeToCry Dynamics CRM: Разработка 5 07.06.2012 14:57
Подсчет всех записей со всех страниц lin2nil Dynamics CRM: Функционал 21 08.12.2011 11:02
Получение информации о сущности через IMetadataService lode Dynamics CRM: Разработка 2 12.07.2011 10:21
Получение списка шарингов записи ZooY Dynamics CRM: Разработка 0 13.03.2010 13:30
Поменял подразделение у всех пользователей в CRM cruzo Dynamics CRM: Администрирование 2 29.09.2005 17:32

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.