コード例 #1
0
        internal Expression GetProjectorExpression(Alias tableAlias, QueryBinder binder)
        {
            Expression?id = GetIdExpression(tableAlias);

            if (IsView)
            {
                var bindings = this.Fields.Values.Select(ef => new FieldBinding(ef.FieldInfo, ef.Field.GetExpression(tableAlias, binder, id !, null, null))).ToReadOnly();

                var hasValue = id == null?Expression.Constant(true) : SmartEqualizer.NotEqualNullable(id, Expression.Constant(null, id.Type.Nullify()));

                return(new EmbeddedEntityExpression(this.Type, hasValue, bindings, null, null, this, null));
            }
            else
            {
                Schema.Current.AssertAllowed(Type, inUserInterface: false);

                var entityContext = new EntityContextInfo((PrimaryKeyExpression)id !, null);

                var period   = GenerateSystemPeriod(tableAlias, binder);
                var bindings = GenerateBindings(tableAlias, binder, id !, period, entityContext);
                var mixins   = GenerateMixins(tableAlias, binder, id !, period, entityContext);

                var result = new EntityExpression(this.Type, (PrimaryKeyExpression)id !, period, tableAlias, bindings, mixins, period, avoidExpandOnRetrieving: false);

                return(result);
            }
        }
コード例 #2
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id)
        {
            var bindings = (from kvp in EmbeddedFields
                            let fi = kvp.Value.FieldInfo
                                     select new FieldBinding(fi, kvp.Value.Field.GetExpression(tableAlias, binder, id))).ToReadOnly();

            Expression hasValue = HasValue == null?SmartEqualizer.NotEqualNullable(id,
                                                                                   id is PrimaryKeyExpression?QueryBinder.NullId(((PrimaryKeyExpression)id).ValueType) : (Expression)Expression.Constant(null, id.Type.Nullify())) :
                                      new ColumnExpression(((IColumn)HasValue).Type, tableAlias, HasValue.Name);

            return(new EmbeddedEntityExpression(this.FieldType, hasValue, bindings, this));
        }
コード例 #3
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            var bindings = (from kvp in EmbeddedFields
                            let fi = kvp.Value.FieldInfo
                                     select new FieldBinding(fi, kvp.Value.Field.GetExpression(tableAlias, binder, id, period, entityContext)))
                           .Concat(entityContext == null ? Enumerable.Empty <FieldBinding>() : Schema.Current.GetAdditionalQueryBindings(this.Route, entityContext, period))
                           .ToReadOnly();

            Expression hasValue = HasValue == null?SmartEqualizer.NotEqualNullable(id,
                                                                                   id is PrimaryKeyExpression?QueryBinder.NullId(((PrimaryKeyExpression)id).ValueType) : (Expression)Expression.Constant(null, id.Type.Nullify())) :
                                      new ColumnExpression(((IColumn)HasValue).Type, tableAlias, HasValue.Name);

            return(new EmbeddedEntityExpression(this.FieldType, hasValue, bindings, this, null, entityContext));
        }
コード例 #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)));
    }