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)); }
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)); }
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); }
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))); }
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); }
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)); } }
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))); }
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)); }