Jeżeli jednak naprawdę zależy nam na wydajności (patrz rozszerzenia CRM Part 3), to możemy przekonwertować nasze QueryExpression na FetchXml (wymaga dodatkowego zapytania do serwera, czyli zamiast jednego z wynikiem mamy jeden z konwersją, drugi z wynikiem), który znów da nam kilka niezbędnych milisekund albo nawet i sekund (na przykład operacja count na tysiącach rekordów) przy wykonywaniu zapytania i pobieraniu danych.

Kod rozszerzenia:

public static class QueryExpressionExtensions
{
    public static string ToFetchXml(this QueryExpression @this, IOrganizationService service)
    {
        var reqConvertToFetchXml = new QueryExpressionToFetchXmlRequest { Query = @this };
        var respConvertToFetchXml = (QueryExpressionToFetchXmlResponse)service.Execute(reqConvertToFetchXml);

        return respConvertToFetchXml.FetchXml;
    }
}

 

Sposób wykorzystania:

// context.Service zwraca IOrganizationService
var x = from a in context.CreateQuery<entity1>()
        join m in context.CreateQuery<entity2>() on a.entity2ref.Id equals m.entity2Id
        select new
        {
            a.Id,
            a.statuscode,
            a.CreatedOn
        };

var query = x.ToQueryExpression().ToFetchXml(context.Service);
var response = context.Service.RetrieveMultiple(new FetchExpression(query));