public void ApplyProjection() { if (Projection.Any()) { return; } var index = 0; var result = new Dictionary <ProjectionMember, Expression>(); foreach (var keyValuePair in _projectionMapping) { result[keyValuePair.Key] = Constant(index); if (keyValuePair.Value is EntityProjectionExpression entityProjection) { foreach (var property in entityProjection.EntityType.GetProperties()) { var columnExpression = entityProjection.GetProperty(property); _projection.Add(new ProjectionExpression(columnExpression, "")); index++; } } else { _projection.Add(new ProjectionExpression((SqlExpression)keyValuePair.Value, "")); index++; } } _projectionMapping = result; }
public void ApplyProjection() { if (Projection.Any()) { return; } var result = new Dictionary <ProjectionMember, Expression>(); foreach (var keyValuePair in _projectionMapping) { if (keyValuePair.Value is EntityProjectionExpression entityProjection) { var map = new Dictionary <IProperty, int>(); foreach (var property in entityProjection.EntityType .GetDerivedTypesInclusive().SelectMany(e => e.GetDeclaredProperties())) { var columnExpression = entityProjection.GetProperty(property); map[property] = _projection.Count; _projection.Add(new ProjectionExpression(columnExpression, alias: "")); } result[keyValuePair.Key] = Constant(map); } else { result[keyValuePair.Key] = Constant(_projection.Count); _projection.Add(new ProjectionExpression((SqlExpression)keyValuePair.Value, alias: "")); } } _projectionMapping = result; }
public void ApplyProjection() { if (Projection.Any()) { return; } var result = new Dictionary <ProjectionMember, Expression>(); foreach (var keyValuePair in _projectionMapping) { result[keyValuePair.Key] = Constant(AddToProjection( keyValuePair.Value, keyValuePair.Key.LastMember?.Name)); } _projectionMapping = result; }
protected override Expression VisitChildren(ExpressionVisitor visitor) { var changed = false; var projections = new List <ProjectionExpression>(); IDictionary <ProjectionMember, Expression> projectionMapping; if (Projection.Any()) { projectionMapping = _projectionMapping; foreach (var item in Projection) { var projection = (ProjectionExpression)visitor.Visit(item); projections.Add(projection); changed |= projection != item; } } else { projectionMapping = new Dictionary <ProjectionMember, Expression>(); foreach (var mapping in _projectionMapping) { var newProjection = visitor.Visit(mapping.Value); changed |= newProjection != mapping.Value; projectionMapping[mapping.Key] = newProjection; } } var tables = new List <TableExpressionBase>(); foreach (var table in _tables) { var newTable = (TableExpressionBase)visitor.Visit(table); changed |= newTable != table; tables.Add(newTable); } var predicate = (SqlExpression)visitor.Visit(Predicate); changed |= predicate != Predicate; var orderings = new List <OrderingExpression>(); foreach (var ordering in _orderings) { var orderingExpression = (SqlExpression)visitor.Visit(ordering.Expression); changed |= orderingExpression != ordering.Expression; orderings.Add(ordering.Update(orderingExpression)); } var offset = (SqlExpression)visitor.Visit(Offset); changed |= offset != Offset; var limit = (SqlExpression)visitor.Visit(Limit); changed |= limit != Limit; if (changed) { var newSelectExpression = new SelectExpression(Alias, projectionMapping, projections, tables) { Predicate = predicate, _orderings = orderings, Offset = offset, Limit = limit, IsDistinct = IsDistinct }; return(newSelectExpression); } return(this); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> protected override Expression VisitChildren(ExpressionVisitor visitor) { Check.NotNull(visitor, nameof(visitor)); var changed = false; var projections = new List <ProjectionExpression>(); IDictionary <ProjectionMember, Expression> projectionMapping; if (Projection.Any()) { projectionMapping = _projectionMapping; foreach (var item in Projection) { var projection = (ProjectionExpression)visitor.Visit(item); projections.Add(projection); changed |= projection != item; } } else { projectionMapping = new Dictionary <ProjectionMember, Expression>(); foreach (var mapping in _projectionMapping) { var newProjection = visitor.Visit(mapping.Value); changed |= newProjection != mapping.Value; projectionMapping[mapping.Key] = newProjection; } } var fromExpression = (RootReferenceExpression)visitor.Visit(FromExpression); changed |= fromExpression != FromExpression; var predicate = (SqlExpression)visitor.Visit(Predicate); changed |= predicate != Predicate; var orderings = new List <OrderingExpression>(); foreach (var ordering in _orderings) { var orderingExpression = (SqlExpression)visitor.Visit(ordering.Expression); changed |= orderingExpression != ordering.Expression; orderings.Add(ordering.Update(orderingExpression)); } var offset = (SqlExpression)visitor.Visit(Offset); changed |= offset != Offset; var limit = (SqlExpression)visitor.Visit(Limit); changed |= limit != Limit; if (changed) { var newSelectExpression = new SelectExpression(projections, fromExpression, orderings) { _projectionMapping = projectionMapping, Predicate = predicate, Offset = offset, Limit = limit, IsDistinct = IsDistinct }; return(newSelectExpression); } return(this); }