public OAssociationFilterExpression(IdentifiableAlias alias, AssociationOrigin origin, Type type, Expression source, Expression predicate)
     : base((DbExpressionType)ODbExpressionType.AssociationFilter, type, alias)
 {
     Source = source;
     Predicate = predicate;
     Origin = origin;
 }
Ejemplo n.º 2
0
        private Expression BindAssociationFilter(AssociationOrigin origin, Type type, Expression source, LambdaExpression predicate)
        {
            var TAssociation = predicate.Parameters[0].Type;
            var sourceMember = Expression.MakeMemberAccess(
                predicate.Parameters[0],
                TAssociation.GetPublicProperty(origin.ToString()));
            var sourceEquals = Expression.Equal(Expression.Constant(source), sourceMember);
            var lambdaType = predicate.Type;
            var sourcePredicate = Expression.Lambda(lambdaType, sourceEquals, predicate.Parameters);

            var completePredicate = Expression.Lambda(
                lambdaType,
                Expression.And(sourcePredicate.Body, predicate.Body),
                predicate.Parameters);

            ProjectionExpression projection = this.VisitSequence(
                this.Mapper.GetQueryExpression(
                    this.Mapper.Mapping.GetEntity(type.GetGenericArguments()[0], this.RepositoryType)));
            this.Map[predicate.Parameters[0]] = projection.Projector;
            Expression where = this.Visit(predicate.Body);
            var alias = this.GetNextAlias();
            ProjectedFields pc = this.ProjectFields(projection.Projector, alias, projection.Select.Alias);
            return new ProjectionExpression(
                new SelectExpression(alias, pc.Fields, projection.Select, where),
                pc.Projector
                );
        }