Ejemplo n.º 1
0
        private Expression CreateItemEqualityExpression(MemberExpression fromItem, MemberExpression toItem)
        {
            Expression itemsAreMapEqual;

            if (this.aItemMapping.ResolvedMapping is IMappingWithSpecialComparision)
            {
                itemsAreMapEqual = Expression.Call(
                    Expression.Constant(this.aItemMapping.ResolvedMapping),
                    MappingMethods.MapEqual(EnumerableReflection <TFrom> .ItemType, EnumerableReflection <TTo> .ItemType),
                    fromItem,
                    toItem
                    );
            }
            else
            {
                Expression fromMapped = fromItem;

                if (!(this.aItemMapping.ResolvedMapping is IDirectMapping))
                {
                    fromMapped = Expression.Call(
                        Expression.Constant(this.aItemMapping.ResolvedMapping),
                        MappingMethods.Map(EnumerableReflection <TFrom> .ItemType, EnumerableReflection <TTo> .ItemType),
                        fromMapped
                        );
                }

                itemsAreMapEqual = Expression.Call(
                    Expression.Constant(EqualityComparerMethods.GetEqualityComparer(EnumerableReflection <TTo> .ItemType)),
                    EqualityComparerMethods.Equals(EnumerableReflection <TTo> .ItemType),
                    fromMapped,
                    toItem
                    );
            }

            if (this.aEqualityRules != null)
            {
                var(selectIdFrom, selectIdTo) = this.aEqualityRules.GetIdSelectors();
                itemsAreMapEqual = Expression.AndAlso(
                    Expression.Equal(
                        ExpressionHelper.Call(
                            selectIdFrom,
                            fromItem
                            ),
                        ExpressionHelper.Call(
                            selectIdTo,
                            toItem
                            )
                        ),
                    itemsAreMapEqual
                    );
            }

            return(itemsAreMapEqual);
        }
Ejemplo n.º 2
0
        public Expression CreateComparisionExpression(ParameterExpression from, ParameterExpression to, LabelTarget end)
        {
            if (this.Mapping.ResolvedMapping is IMappingWithSpecialComparision)
            {
                return(Expression.IfThen(
                           Expression.Not(
                               Expression.Call(
                                   Expression.Constant(this.Mapping.ResolvedMapping),
                                   MappingMethods.MapEqual(this.From.Type, this.To.Type),
                                   this.From.CreateGetterExpression(from),
                                   this.To.CreateGetterExpression(to)
                                   )
                               ),
                           Expression.Return(end, Expression.Constant(false))
                           ));
            }
            else
            {
                var fromMapped = this.From.CreateGetterExpression(from);

                if (!(this.Mapping.ResolvedMapping is IDirectMapping))
                {
                    fromMapped = Expression.Call(
                        Expression.Constant(this.Mapping.ResolvedMapping),
                        MappingMethods.Map(this.From.Type, this.To.Type),
                        fromMapped
                        );
                }

                return(Expression.IfThen(
                           Expression.Not(
                               Expression.Call(
                                   Expression.Constant(EqualityComparerMethods.GetEqualityComparer(this.To.Type)),
                                   EqualityComparerMethods.Equals(this.To.Type),
                                   fromMapped,
                                   this.To.CreateGetterExpression(to)
                                   )
                               ),
                           Expression.Return(end, Expression.Constant(false))
                           ));
            }
        }