Czasami liczy się wydajność rozwiązania, jednak wciąż chcielibyśmy zachować prostotę pracy z CRM, stąd też rozszerzenie ToQueryExpression, które umożliwia konwersję zapytania LINQ to szybszego jej odpowiednika.

Kod rozszerzenia:

public static class QueryExpressionExtensions
{
    public static QueryExpression ToQueryExpression(this IQueryable @this)
    {
        var queryProvider = @this.Provider;
        var translateMethod = queryProvider.GetType().GetMethod("Translate");
        var query = (QueryExpression)translateMethod.Invoke(queryProvider, new object[] { @this.Expression });

        return query;
    }
}

Testów rozszerzenia nie ma, jako, że jest to wewnętrzna metoda MS wykorzystywana tak czy siak podczas wysyłania zapytania do CRM. Z tą różnicą, iż teraz mając QueryExpression, nie będziemy mieli całego procesu mapowania na silnie typowane obiekty, co daje nam sporo, naprawdę sporo czasu :)

Sposób wykorzystania:

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();
var retrieve = new RetrieveMultipleRequest { Query = query };
var retrieved = (RetrieveMultipleResponse)context.Service.Execute(retrieve);