コード例 #1
0
        public static Expression PolymorphicEqual(Expression exp1, Expression exp2)
        {
            if (exp1.NodeType == ExpressionType.New && exp2.NodeType == ExpressionType.New)
            {
                return((exp1 as NewExpression).Arguments.ZipStrict(
                           (exp2 as NewExpression).Arguments, (o, i) => SmartEqualizer.PolymorphicEqual(o, i)).AggregateAnd());
            }

            Expression result;

            result = PrimaryKeyEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = ObjectEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = ConditionalEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = CoalesceEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = LiteEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = EntityEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = TypeEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = MListElementEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            return(EqualNullable(exp1, exp2));
        }
コード例 #2
0
        public static Expression InPrimaryKey(Expression element, PrimaryKey[] values)
        {
            var cleanValues = values.Select(a => a.Object).ToArray();

            var cleanElement = SmartEqualizer.UnwrapPrimaryKey(element);

            if (cleanElement == NewId)
            {
                return(False);
            }

            return(InExpression.FromValues(DbExpressionNominator.FullNominate(cleanElement), cleanValues));
        }
コード例 #3
0
ファイル: SmartEqualizer.cs プロジェクト: ze-german/framework
        private static Expression EnumEquals(Expression exp1, Expression exp2)
        {
            var exp1Clean = RemoveConvertChain(exp1);
            var exp2Clean = RemoveConvertChain(exp2);


            if (exp1 != exp1Clean || exp2 != exp2Clean)
            {
                var type = exp2.Type.IsNullable() ? exp1.Type.Nullify(): exp1.Type;


                return(SmartEqualizer.EqualNullable(exp1Clean.TryConvert(type), exp2Clean.TryConvert(type)));
            }

            return(null);
        }
コード例 #4
0
        private Expression?LiteToString(LiteReferenceExpression lite, Expression typeId)
        {
            if (lite.CustomToStr != null)
            {
                return(Visit(lite.CustomToStr));
            }

            if (lite.Reference is ImplementedByAllExpression)
            {
                return(null);
            }

            if (lite.LazyToStr)
            {
                return(null);
            }

            if (IsCacheable(typeId))
            {
                return(null);
            }

            if (lite.Reference is EntityExpression entityExp)
            {
                if (entityExp.AvoidExpandOnRetrieving)
                {
                    return(null);
                }

                return(binder.BindMethodCall(Expression.Call(entityExp, EntityExpression.ToStringMethod)));
            }

            if (lite.Reference is ImplementedByExpression ibe)
            {
                if (ibe.Implementations.Any(imp => imp.Value.AvoidExpandOnRetrieving))
                {
                    return(null);
                }

                return(ibe.Implementations.Values.Select(ee =>
                                                         new When(SmartEqualizer.NotEqualNullable(ee.ExternalId, QueryBinder.NullId(ee.ExternalId.ValueType)),
                                                                  binder.BindMethodCall(Expression.Call(ee, EntityExpression.ToStringMethod)))
                                                         ).ToCondition(typeof(string)));
            }

            return(binder.BindMethodCall(Expression.Call(lite.Reference, EntityExpression.ToStringMethod)));
        }
コード例 #5
0
        private static Expression EnumEquals(Expression exp1, Expression exp2)
        {
            var exp1Clean = RemoveConvertChain(exp1);
            var exp2Clean = RemoveConvertChain(exp2);

            if (exp1Clean.Type.UnNullify() == typeof(DayOfWeek) ||
                exp2Clean.Type.UnNullify() == typeof(DayOfWeek))
            {
                return(SmartEqualizer.EqualNullable(
                           ConstantToDayOfWeek(exp1Clean) ?? exp1Clean,
                           ConstantToDayOfWeek(exp2Clean) ?? exp2Clean));
            }

            if (exp1 != exp1Clean || exp2 != exp2Clean)
            {
                var type = exp2.Type.IsNullable() ? exp1.Type.Nullify(): exp1.Type;

                return(SmartEqualizer.EqualNullable(exp1Clean.TryConvert(type), exp2Clean.TryConvert(type)));
            }

            return(null);
        }
コード例 #6
0
        public static Expression InPrimaryKey(Expression element, PrimaryKey[] values)
        {
            var cleanValues = values.Select(a => a.Object).ToArray();

            var cleanElement = SmartEqualizer.UnwrapPrimaryKey(element);

            if (cleanElement == NewId)
            {
                return(False);
            }

            cleanElement = DbExpressionNominator.FullNominate(cleanElement) !;

            if (cleanElement.Type == typeof(string))
            {
                return(InExpression.FromValues(cleanElement, cleanValues.Select(a => (object)a.ToString() !).ToArray()));
            }
            else
            {
                return(InExpression.FromValues(cleanElement, cleanValues));
            }
        }
コード例 #7
0
            protected internal override Expression VisitMListElement(MListElementExpression mle)
            {
                Type type = mle.Type;

                var bindings = new List <MemberAssignment>
                {
                    Expression.Bind(type.GetProperty("RowId"), Visit(mle.RowId.UnNullify())),
                    Expression.Bind(type.GetProperty("Parent"), Visit(mle.Parent)),
                };

                if (mle.Order != null)
                {
                    bindings.Add(Expression.Bind(type.GetProperty("Order"), Visit(mle.Order)));
                }

                bindings.Add(Expression.Bind(type.GetProperty("Element"), Visit(mle.Element)));

                var init = Expression.MemberInit(Expression.New(type), bindings);

                return(Expression.Condition(SmartEqualizer.NotEqualNullable(Visit(mle.RowId.Nullify()), NullId),
                                            init,
                                            Expression.Constant(null, init.Type)));
            }
コード例 #8
0
        public static Expression PolymorphicEqual(Expression exp1, Expression exp2)
        {
            if (exp1.NodeType == ExpressionType.New || exp2.NodeType == ExpressionType.New)
            {
                if (exp1.IsNull() || exp2.IsNull())
                {
                    return(Expression.Constant(false));
                }

                exp1 = ConstanToNewExpression(exp1) ?? exp1;
                exp2 = ConstanToNewExpression(exp2) ?? exp2;

                return(((NewExpression)exp1).Arguments.ZipStrict(
                           ((NewExpression)exp2).Arguments, (o, i) => SmartEqualizer.PolymorphicEqual(o, i)).AggregateAnd());
            }

            Expression?result;

            result = PrimaryKeyEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = ObjectEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = ConditionalEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = CoalesceEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = LiteEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = EntityEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = TypeEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            result = MListElementEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }


            result = EnumEquals(exp1, exp2);
            if (result != null)
            {
                return(result);
            }

            return(EqualNullable(exp1, exp2));
        }