0

我正在使用 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]:当指定了聚合操作且既不是 groupby 也不是聚合时,无法请求属性。NodeXml :(故障详细信息等于 Microsoft.Xrm.Sdk.OrganizationServiceFault)。

您如何在某些值而不是其他值上使用聚合?

4

2 回答 2

1

错误消息为您提供了答案 - FetchXML 无法做到这一点。您需要进行两次 FetchXML 调用;一个用于您的聚合,一个用于您的数据。

于 2011-09-26T03:51:09.993 回答
0

所以,这里发生了一些事情。问题不在于您的查询无法使用 FetchXML 实现,而是任何查询语言(包括 SQL)都无法实现。您上面的 FetchXML 的 SQL 如下:

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.错误,这正是您的异常试图告诉您的内容。要解决此问题,您还需要通过在每个相应元素中包含属性来按每个非聚合列(在本例中为createdoncustomerid)进行分组。groupby='true'attribute

其次,按每个机会的创建日期分组或多或少是徒劳的分组,因为机会通常是在不同的日期时间创建的,所以这种分组只会返回整个表。Microsoft 正确地认识到了这一点,因此如果您修复了上面的分组问题,您将遇到另一个与 datetime 列相关的异常。如果您继续阅读我之前分享dategrouping的文章,这里有一个示例说明您可以使用该属性按不同的日期间隔(年、月、季度等)进行分组的不同方式。

但是,我觉得即使在修复了一般分组问题,然后是日期分组问题之后,结果集可能仍然不是你想要的。如果不是,那么发布一个您希望看到的结果集示例可能会有所帮助,然后说明 FetchXML 是否有能力将该结果集交付给您。

于 2011-09-27T03:55:26.990 回答