protected virtual void TrackEntitiesInResults <TResult>( [NotNull] QueryModel queryModel) { Check.NotNull(queryModel, nameof(queryModel)); var lastTrackingModifier = QueryCompilationContext.QueryAnnotations .OfType <TrackingResultOperator>() .LastOrDefault(); if (queryModel.GetOutputDataInfo() is StreamedScalarValueInfo || !QueryCompilationContext.TrackQueryResults && lastTrackingModifier == null || lastTrackingModifier != null && !lastTrackingModifier.IsTracking) { return; } var entityTrackingInfos = _entityResultFindingExpressionVisitorFactory.Create(QueryCompilationContext) .FindEntitiesInResult(queryModel.SelectClause.Selector); if (entityTrackingInfos.Any()) { var resultItemType = _expression.Type.GetSequenceType(); var resultItemTypeInfo = resultItemType.GetTypeInfo(); MethodInfo trackingMethod; if (resultItemTypeInfo.IsGenericType && (resultItemTypeInfo.GetGenericTypeDefinition() == typeof(IGrouping <,>) || resultItemTypeInfo.GetGenericTypeDefinition() == typeof(IAsyncGrouping <,>))) { trackingMethod = LinqOperatorProvider.TrackGroupedEntities .MakeGenericMethod( resultItemType.GenericTypeArguments[0], resultItemType.GenericTypeArguments[1], queryModel.SelectClause.Selector.Type); } else { trackingMethod = LinqOperatorProvider.TrackEntities .MakeGenericMethod( resultItemType, queryModel.SelectClause.Selector.Type); } _expression = Expression.Call( trackingMethod, _expression, QueryContextParameter, Expression.Constant(entityTrackingInfos), Expression.Constant( _getEntityAccessors .MakeGenericMethod(queryModel.SelectClause.Selector.Type) .Invoke( null, new object[] { entityTrackingInfos, queryModel.SelectClause.Selector }))); } }