private void AllocateParameterAndReplacer() { if (queryTarget == null) { queryParameter = null; queryParameterReplacer = new ExtendedExpressionReplacer(e => e); return; } var closureType = queryTarget.GetType(); var parameterType = WellKnownOrmTypes.ParameterOfT.MakeGenericType(closureType); var valueMemberInfo = parameterType.GetProperty(nameof(Parameter <object> .Value), closureType); queryParameter = (Parameter)System.Activator.CreateInstance(parameterType, "pClosure"); queryParameterReplacer = new ExtendedExpressionReplacer(expression => { if (expression.NodeType != ExpressionType.Constant) { return(null); } if (expression.Type.IsClosure()) { if (expression.Type == closureType) { return(Expression.MakeMemberAccess(Expression.Constant(queryParameter, parameterType), valueMemberInfo)); } throw new NotSupportedException(string.Format( Strings.ExExpressionDefinedOutsideOfCachingQueryClosure, expression)); } if (closureType.DeclaringType == null) { if (expression.Type == closureType) { return(Expression.MakeMemberAccess(Expression.Constant(queryParameter, parameterType), valueMemberInfo)); } } else { if (expression.Type == closureType) { return(Expression.MakeMemberAccess(Expression.Constant(queryParameter, parameterType), valueMemberInfo)); } if (expression.Type == closureType.DeclaringType) { var memberInfo = closureType.TryGetFieldInfoFromClosure(expression.Type); if (memberInfo != null) { return(Expression.MakeMemberAccess( Expression.MakeMemberAccess(Expression.Constant(queryParameter, parameterType), valueMemberInfo), memberInfo)); } } } return(null); }); }
// Constructors public ItemProjectorExpression(Expression expression, CompilableProvider dataSource, TranslatorContext context) : base(ExtendedExpressionType.ItemProjector, expression.Type) { DataSource = dataSource; Context = context; var newApplyParameter = Context.GetApplyParameter(dataSource); var applyParameterReplacer = new ExtendedExpressionReplacer(ex => ex is SubQueryExpression ? ((SubQueryExpression)ex).ReplaceApplyParameter(newApplyParameter) : null); Item = applyParameterReplacer.Replace(expression); }
public ItemProjectorExpression EnsureEntityIsJoined() { var dataSource = DataSource; var newItem = new ExtendedExpressionReplacer(e => { if (e is EntityExpression) { var entityExpression = (EntityExpression)e; var typeInfo = entityExpression.PersistentType; if (typeInfo.Fields.All(fieldInfo => entityExpression.Fields.Any(entityField => entityField.Name == fieldInfo.Name))) { return(entityExpression); } var joinedIndex = typeInfo.Indexes.PrimaryIndex; var joinedRs = joinedIndex.GetQuery().Alias(Context.GetNextAlias()); var keySegment = entityExpression.Key.Mapping; var keyPairs = keySegment.GetItems() .Select((leftIndex, rightIndex) => new Pair <int>(leftIndex, rightIndex)) .ToArray(); var offset = dataSource.Header.Length; var dataSourceAsJoin = dataSource as JoinProvider; dataSource = entityExpression.IsNullable || (dataSourceAsJoin != null && dataSourceAsJoin.JoinType == JoinType.LeftOuter) ? dataSource.LeftJoin(joinedRs, keyPairs) : dataSource.Join(joinedRs, keyPairs); EntityExpression.Fill(entityExpression, offset); return(entityExpression); } if (e is EntityFieldExpression) { var entityFieldExpression = (EntityFieldExpression)e; if (entityFieldExpression.Entity != null) { return(entityFieldExpression.Entity); } var typeInfo = entityFieldExpression.PersistentType; var joinedIndex = typeInfo.Indexes.PrimaryIndex; var joinedRs = joinedIndex.GetQuery().Alias(Context.GetNextAlias()); var keySegment = entityFieldExpression.Mapping; var keyPairs = keySegment.GetItems() .Select((leftIndex, rightIndex) => new Pair <int>(leftIndex, rightIndex)) .ToArray(); var offset = dataSource.Header.Length; var dataSourceAsJoin = dataSource as JoinProvider; dataSource = entityFieldExpression.IsNullable || (dataSourceAsJoin != null && dataSourceAsJoin.JoinType == JoinType.LeftOuter) ? dataSource.LeftJoin(joinedRs, keyPairs) : dataSource.Join(joinedRs, keyPairs); entityFieldExpression.RegisterEntityExpression(offset); return(entityFieldExpression.Entity); } if (e is FieldExpression) { var fe = (FieldExpression)e; if (fe.ExtendedType == ExtendedExpressionType.Field) { return(fe.RemoveOwner()); } } return(null); }) .Replace(Item); return(new ItemProjectorExpression(newItem, dataSource, Context)); }
public QueryCachingScope(Parameter queryParameter, ExtendedExpressionReplacer queryParameterReplacer, bool execute) { QueryParameter = queryParameter; QueryParameterReplacer = queryParameterReplacer; Execute = execute; }
// Constructors public QueryCachingScope(Parameter queryParameter, ExtendedExpressionReplacer queryParameterReplacer) : this(queryParameter, queryParameterReplacer, true) { }