Использование FetchXML в CRM 2011 - PullRequest
0 голосов
/ 26 сентября 2011

Я использую FetchXML, и я группирую и использую счетчик для двух объектов, но остальные объекты, которые мне не нужны, сгруппированы, мне просто нужны данные, которые будут удалены. Например, это мой код:

string groupby1 = @" 
<fetch distinct='false' mapping='logical' aggregate='true'> 
 <entity name='opportunity'>
  <attribute name='name' alias='opportunity_count' aggregate='countcolumn' />  
  <attribute name='ownerid' alias='ownerid' groupby='true' />
  <attribute name='createdon' alias='createdon' /> 
  <attribute name='customerid' alias='customerid' /> 
 </entity> 
</fetch>";

EntityCollection groupby1_result = orgProxy.RetrieveMultiple(new FetchExpression(groupby1));

foreach (var c in groupby1_result.Entities)
{
  Int32 count = (Int32)((AliasedValue)c["opportunity_count"]).Value;
  string OwnerID = ((EntityReference)((AliasedValue)c["ownerid"]).Value).Name;
  DateTime dtCreatedOn = ((DateTime)((AliasedValue)c["createdon"]).Value);
  string CustomerName = ((EntityReference)((AliasedValue)c["customerid"]).Value).Name;
}

Но я получаю эту ошибку:

ИСКЛЮЧЕНИЕ: System.ServiceModel.FaultException`1 [Microsoft.Xrm.Sdk.OrganizationServiceFault]: атрибут не может быть запрошен, когда задана агрегирующая операция, и она не является ни групповой, ни агрегатной. NodeXml: (Сведения об ошибке совпадают с Microsoft.Xrm.Sdk.OrganizationServiceFault).

Как вы используете агрегаты для одних значений, а не для других?

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Сообщение об ошибке дает вам ответ - это невозможно с FetchXML.Вам нужно будет сделать два вызова FetchXML;один для ваших агрегатов и один для ваших данных.

0 голосов
/ 27 сентября 2011

Итак, здесь происходит несколько вещей.Проблема не столько в том, что ваш запрос недостижим с FetchXML, сколько в том, что он не достижим в любом языке запросов, включая SQL.SQL вашего FetchXML выше выглядит следующим образом:

SELECT ownerID, createdon, customerid
FROM dbo.Opportunity
GROUP BY ownerID

Если вы попытаетесь запустить этот SQL для своей базы данных, вы получите стандартную ошибку Column 'dbo.Opportunity.CreatedOn' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause., которая является именно тем, что пытается сделать ваше исключениесказать тебе.Чтобы решить эту проблему, вам также необходимо сгруппировать данные по каждому неагрегированному столбцу (в данном случае createdon и customerid), включив атрибут groupby='true' в каждый соответствующий элемент attribute.

Во-вторыхгруппирование по дате создания каждой возможности является более или менее бесполезной группировкой, поскольку возможности обычно создаются в разное время, поэтому такая группировка просто возвращает всю таблицу.Microsoft справедливо признает это, поэтому, если вы исправите проблему с группировкой, описанную выше, вы столкнетесь с другим исключением, связанным со столбцом datetime.Если вы продолжите читать статью , которой я ранее поделился , есть пример, в котором рассматриваются различные способы группировки по разным интервалам дат (год, месяц, квартал и т. Д.) С помощью атрибута dategrouping.

Но у меня возникает ощущение, что даже после устранения общих проблем с группировкой, а затем и проблемы с категорированием, набор результатов может быть не таким, как вы хотите.Если это не так, это может помочь опубликовать пример набора результатов, который вы ожидаете увидеть, а затем указать, имеет ли FetchXML возможность доставить вам этот набор.

...