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