Dataverse Group By Attribute In Fetchxml C#

Today's blog will be a quick tip to group attributes and get result in c# using Fetchxml and Linq.

While working on one of the requirements I was asked to get the data from CRM and group it by Owner. I have used the below code to achieve my requirement which can be helpful for you as well.

string queryRoomAllocDetails = $@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='crfdf_roomallocationdetails'>
<attribute name='crfdf_roomallocationdetailsid' />
<attribute name='crfdf_name' />
<attribute name='createdon' />
<attribute name='statuscode' />
<attribute name='statecode' />
<attribute name='crfdf_room' />
<attribute name='crfdf_rentpermonth' />
<attribute name='overriddencreatedon' />
<attribute name='ownerid' />
<attribute name='modifiedon' />
<attribute name='modifiedonbehalfby' />
<attribute name='modifiedby' />
<attribute name='crfdf_lastpaymentdate' />
<attribute name='crfdf_isvacant' />
<attribute name='crfdf_isnotify' />
<attribute name='createdonbehalfby' />
<attribute name='createdby' />
<attribute name='crfdf_contacts' />
<attribute name='crfdf_contact' />
<attribute name='crfdf_allocatedto' />
<attribute name='crfdf_allocateddate' />
<order attribute='crfdf_name' descending='false' />
</entity>
</fetch>";
EntityCollection roomAllocDetails = svc.RetrieveMultiple(new FetchExpression(queryRoomAllocDetails));
var responseRoomAllocDetails = roomAllocDetails.Entities.GroupBy(x => x.Attributes["ownerid"]).Select(x => x);
foreach(var data in responseRoomAllocDetails) {
    Console.WriteLine(((EntityReference) data.Key).Name);
    foreach(var result in data) {
        Console.WriteLine(result.GetAttributeValue < string > ("crfdf_name"));
    }
}

FetchXML OOB does suppport grouping but you can only fetch fields which are part of the grouping and aggregate function (Min, Max, Count) applied attributes only.

Hope this helps!