Выполнение сложного запроса с помощью Dynamics CRM 4.0
-
06-07-2019 - |
Вопрос
У меня есть два пользовательских объекта, Product и ProductType, связанных вместе отношением "многие к одному".Продукт имеет поле подстановки для ProductType.
Я пытаюсь написать запрос для получения товаров типа 1 с ценой более 100 и товаров типа 2 с ценой ниже 100.
Вот как я бы сделал это в SQL :
select *
from Product P
inner join ProductType T on T.Id = P.TypeId
where (T.Code = 'Type1' and P.Price >= 100)
or (T.Code = 'Type2' and P.Price < 100)
Я не могу придумать способ создать QueryExpression, чтобы сделать именно это.Я знаю, что мог бы сделать это с помощью двух запросов, но я бы хотел свести к минимуму циклические обращения к серверу.
Есть ли способ выполнить этот запрос только за одну операцию ?
Спасибо!
Решение 3
К сожалению, нет, это невозможно сделать с помощью QueryExpression или FetchXML .По крайней мере, не с Dynamics CRM 4.Будем надеяться, что они включат эту функцию в версию 5 (2-я половина 2010 года)
Другие советы
На QueryExpression
объект, существует свойство, называемое LinkEntities
.Вы можете создавать LinkEntity
объекты, которые указывают информацию "join", а затем добавляют ее к вашему объекту link.Например:
QueryExpression q = new QueryExpression();
LinkEntity l = new LinkEntity();
l.LinkFromAttributeName = "fromatt";
l.LinkToAttributeName = "toatt";
l.LinkFromEntityName = "product";
l.LinkToEntityName = "producttype";
FilterExpression f = new FilterExpression();
f.AddCondition(new ConditionExpression("code", ConditionOperator.Equal, "type1"));
l.LinkCriteria = f;
q.LinkEntities.Add(l);
Обратите внимание, что на самом деле вы не можете получить доступ ни к одному из атрибутов вашего объекта ProductType из QueryExpression, который извлекает Products .Для этого вам придется использовать Fetch XML.
Вы могли бы также дать LinqtoCRM взгляд.Он преобразует запросы в FetchXML, чтобы вы могли получать атрибуты для соединенных объектов.