Использование FetchXML в CRM 2011

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

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).

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


person Community    schedule 26.09.2011    source источник


Ответы (2)


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

person Josh Painter    schedule 26.09.2011
comment
Спасибо. Есть идеи, как сделать два вызова FetchXML и связать их вместе? - person ; 26.09.2011
comment
Я не уверен, что вы спрашиваете - как вы связываете результаты этих двух вызовов вместе, это должен определить ваш код на стороне клиента. - person Josh Painter; 26.09.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 правильно понимает это, поэтому, если вы устраните указанную выше проблему с группировкой, вы столкнетесь с другим исключением, связанным со столбцом даты и времени. Если вы продолжите читать статью я бы ранее опубликованных, есть пример, в котором рассматриваются различные способы группировки по разным интервалам дат (год, месяц, квартал и т. д.) с использованием атрибута dategrouping.

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

person Peter Majeed    schedule 27.09.2011