Показать сообщение отдельно
Старый 04.04.2008, 11:36   #1  
Lithium is offline
Lithium
Участник
 
20 / 10 (1) +
Регистрация: 17.07.2007
Выборка данных из нескольких сущностей, MS CRM 3
Пишу веб-службу, которая должна возвращать для заданной организации список ее сервисных обращений (дата создания, заголовок, код, текущий статус), и в случае если обращение разрешилось - кол-во затраченного времени, описание решения проблемы, имя инженера, кто занимался обращением.
Проблема в том,что поля которые нужно выбрать, раскиданы по разным сущностям (incident и incidentresolution).

Пишу следующий код:
X++:
Guid GUID = newGuid(p_guid);
QueryExpression query = newQueryExpression();
query.EntityName = EntityName.incident.ToString();
ColumnSet cols = newColumnSet();

cols.Attributes = newstring[] { "ticketnumber", "title","createdon","statecode" };
OrderExpression order = newOrderExpression();
order.OrderType = OrderType.Descending;
order.AttributeName = "createdon";
query.ColumnSet = cols;
query.Orders = newOrderExpression[] { order };
query.Criteria = newFilterExpression();
ConditionExpression exp = newConditionExpression();
exp.AttributeName = "customerid";
exp.Operator = ConditionOperator.Equal;
exp.Values = newobject[] { GUID.ToString() };
query.Criteria.Conditions = newConditionExpression[] { exp };
LinkEntity le = newLinkEntity();
le.LinkFromEntityName = EntityName.incident.ToString();
le.LinkFromAttributeName = "incidentid";
le.LinkToEntityName = EntityName.incidentresolution.ToString();
le.LinkToAttributeName = "incidentid";
le.JoinOperator = JoinOperator.LeftOuter;
query.LinkEntities = newLinkEntity[] { le };/**/
 
BusinessEntityCollection returned = srv.RetrieveMultiple(query);
if (returned.BusinessEntities.Length > 0)
{
Incident[] p = newIncident[returned.BusinessEntities.Length];
int i = 0;
foreach (BusinessEntity be in returned.BusinessEntities)
{
incident inc = (incident)be;
p[i].Code = inc.ticketnumber;
p[i].Date = inc.createdon.date;
if (inc.title != null)
p[i].Title = inc.title;
else p[i].Title = "отсутствует";
if (inc.statecode.ToString() != null)
p[i].Status = inc.statecode.Value.ToString();
else p[i].Status = "не определен";
i++;
}
return p;
}
else
{
Incident ic;
ic.Code = "";
ic.Date = "";
ic.Status = "";
ic.Title = "нет обращений";
returnnewIncident[] { ic };
}
он работает, но выбирает данные только из одно сущности. стоит только добавить в ColumnSet поле из incidentresolution - работать перестает.

Как произвести такую выборку??