Exemplo n.º 1
0
        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
                })));
            }
        }