public OAssociationFilterExpression(IdentifiableAlias alias, AssociationOrigin origin, Type type, Expression source, Expression predicate) : base((DbExpressionType)ODbExpressionType.AssociationFilter, type, alias) { Source = source; Predicate = predicate; Origin = origin; }
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 ); }