private bool TryBindProperty(Expression source, MemberIdentity member, out SqlExpression expression) { if (source is EntityShaperExpression entityShaperExpression) { var projectionBindingExpression = (ProjectionBindingExpression)entityShaperExpression.ValueBufferExpression; var selectExpression = ((SelectExpression)projectionBindingExpression.QueryExpression); var entityType = entityShaperExpression.EntityType; var property = member.MemberInfo != null ? entityType.FindProperty(member.MemberInfo) : entityType.FindProperty(member.Name); if (property != null) { expression = selectExpression.BindProperty(property, projectionBindingExpression); return(true); } var navigation = member.MemberInfo != null ? entityType.FindNavigation(member.MemberInfo) : entityType.FindNavigation(member.Name); expression = selectExpression.BindNavigation(navigation, projectionBindingExpression); return(true); } else if (source is ObjectAccessExpression objectAccessExpression) { var entityType = objectAccessExpression.Navigation.GetTargetType(); var property = member.MemberInfo != null ? entityType.FindProperty(member.MemberInfo) : entityType.FindProperty(member.Name); if (property != null) { expression = new KeyAccessExpression(property, objectAccessExpression); return(true); } var navigation = member.MemberInfo != null ? entityType.FindNavigation(member.MemberInfo) : entityType.FindNavigation(member.Name); expression = new ObjectAccessExpression(navigation, objectAccessExpression); return(true); } expression = null; return(false); }
public ObjectAccessExpression BindNavigation(INavigation navigation) { if (!EntityType.GetTypesInHierarchy().Contains(navigation.DeclaringEntityType)) { throw new InvalidOperationException( $"Called EntityProjectionExpression.GetNavigation() with incorrect INavigation. EntityType:{EntityType.DisplayName()}, Navigation:{navigation.Name}"); } if (!_navigationExpressionsCache.TryGetValue(navigation, out var expression)) { expression = new ObjectAccessExpression(navigation, AccessExpression); _navigationExpressionsCache[navigation] = expression; } return(expression); }
private bool TryBindProperty(Expression source, MemberIdentity member, out SqlExpression expression) { if (source is EntityProjectionExpression entityProjectionExpression) { var entityType = entityProjectionExpression.EntityType; var property = member.MemberInfo != null ? entityType.FindProperty(member.MemberInfo) : entityType.FindProperty(member.Name); if (property != null) { expression = entityProjectionExpression.BindProperty(property); return(true); } var navigation = member.MemberInfo != null ? entityType.FindNavigation(member.MemberInfo) : entityType.FindNavigation(member.Name); expression = entityProjectionExpression.BindNavigation(navigation); return(true); } else if (source is ObjectAccessExpression objectAccessExpression) { var entityType = objectAccessExpression.Navigation.GetTargetType(); var property = member.MemberInfo != null ? entityType.FindProperty(member.MemberInfo) : entityType.FindProperty(member.Name); if (property != null) { expression = new KeyAccessExpression(property, objectAccessExpression); return(true); } var navigation = member.MemberInfo != null ? entityType.FindNavigation(member.MemberInfo) : entityType.FindNavigation(member.Name); expression = new ObjectAccessExpression(navigation, objectAccessExpression); return(true); } expression = null; return(false); }
protected abstract Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression);
protected override Expression VisitObjectAccess(ObjectAccessExpression objectAccessExpression) { _sqlBuilder.Append(objectAccessExpression); return(objectAccessExpression); }