public override DbExpression Visit(DbScanExpression expression)
        {
            // a bit harder to get the metadata in CSpace
            var item = expression.Target.ElementType.MetadataProperties.First(p => p.Name == "Configuration");

            // using reflection to get the Annotations property as EntityTtypeConfiguration is an internal class in EF
            Dictionary<string, object> annotations = new Dictionary<string, object>();
            var value = item.Value;
            var propertyInfo = value.GetType().GetProperty("Annotations");
            if (propertyInfo != null)
            {
                annotations = (Dictionary<string, object>) propertyInfo.GetValue(value, null);
            }

            if (!annotations.Any())
            {
                return base.Visit(expression);
            }

            DbExpression current = expression;
            foreach (var globalFilter in annotations.Where(a => a.Key.StartsWith("globalFilter")))
            {
                var convention = (FilterDefinition)globalFilter.Value;

                Filter filterConfig;

                string filterName = globalFilter.Key.Split(new[] { "globalFilter_" }, StringSplitOptions.None)[1];

                if (!FilterExtensions.FilterConfigurations.TryGetValue(new Tuple<string, object>(filterName, _contextForInterception.GetInternalContext()), out filterConfig))
                    continue;

                if (!filterConfig.IsEnabled)
                    continue;

                var linqExpression = convention.Predicate(_contextForInterception, filterConfig.ParameterValues);

                var funcletizerType = typeof(DefaultExpressionVisitor).Assembly.GetType(
                    "System.Data.Entity.Core.Objects.ELinq.Funcletizer");
                var funcletizerFactoryMethod = funcletizerType.GetMethod("CreateQueryFuncletizer",
                    BindingFlags.Static | BindingFlags.NonPublic);
                var funcletizer = funcletizerFactoryMethod.Invoke(null, new[] { _objectContext });

                var converterType = typeof(DefaultExpressionVisitor).Assembly.GetType(
                    "System.Data.Entity.Core.Objects.ELinq.ExpressionConverter");
                var converter = Activator.CreateInstance(converterType,
                    BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { funcletizer, linqExpression }, null);
                var convertMethod = converterType.GetMethod("Convert",
                    BindingFlags.NonPublic | BindingFlags.Instance);
                var result = (DbFilterExpression)convertMethod.Invoke(converter, null);

                var binding = current.Bind();
                var normalizer = new BindingNormalizer(binding);
                var output = result.Predicate.Accept(normalizer);
                current = binding.Filter(output);
            }
            return current;
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = SoftDeleteAttribute.GetSoftDeleteColumnName(expression.Target.ElementType);
            if (column != null)
            {
                // Just because the entity has the soft delete annotation doesn't mean that 
                // this particular table has the column. This occurs in situation like TPT
                // inheritance mapping and entity splitting where one type maps to multiple 
                // tables.
                // We only apply the filter if the column is actually present in this table.
                // If not, then the query is going to be joining to the table that does have
                // the column anyway, so the filter will still be applied.
                var table = (EntityType)expression.Target.ElementType;
                if (table.Properties.Any(p => p.Name == column))
                {
                    var binding = DbExpressionBuilder.Bind(expression);
                    return DbExpressionBuilder.Filter(
                        binding,
                        DbExpressionBuilder.NotEqual(
                            DbExpressionBuilder.Property(
                                DbExpressionBuilder.Variable(binding.VariableType, binding.VariableName),
                                column),
                            DbExpression.FromBoolean(true)));
                }
            }

            return base.Visit(expression);
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
#if DEBUG_VISITS
            System.Diagnostics.Debug.Print("Visit(DbScanExpression): Target.Name={0}", expression.Target.Name);
#endif
            //  If using SSpace:
            //  This method will be called for all query expressions.  If there is a filter included (in a .Where() for example),
            //  Visit(DbFilterExpression) will be called first and our dynamic filters will have already been included.
            //  Otherwise, we do that here.
            //  If using CSpace:
            //  This method will only be called for the initial entity.  Any other references to other entities will be
            //  handled by the Visit(DbPropertyExpression) - this includes filter references and includes.

            var filterList = FindFiltersForEntitySet(expression.Target.ElementType.MetadataProperties);
            System.Diagnostics.Debug.Print("  Found {0} filters", filterList.Count());

            var baseResult = base.Visit(expression);
            if (filterList.Any())
            {
                var binding = DbExpressionBuilder.Bind(baseResult);
                var newFilterExpression = BuildFilterExpressionWithDynamicFilters(filterList, binding, null);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return newFilterExpression;
                }
            }

            return baseResult;
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            //  This method will be called for all query expressions.  If there is a filter included (in a .Where() for example),
            //  Visit(DbFilterExpression) will be called first and our dynamic filters will have already been included.
            //  Otherwise, we do that here.

            string entityName = expression.Target.Name;
            var filterList = expression.Target.ElementType.MetadataProperties
                .Where(mp => mp.Name.Contains("customannotation:" + DynamicFilterConstants.AttributeNamePrefix))
                .Select(m => m.Value as DynamicFilterDefinition);

            var baseResult = base.Visit(expression);
            if (filterList.Any())
            {
                var binding = DbExpressionBuilder.Bind(baseResult);
                var newFilterExpression = BuildFilterExpressionWithDynamicFilters(entityName, filterList, binding, null);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return newFilterExpression;
                }
            }

            return baseResult;
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            expression = (DbScanExpression)base.Visit(expression);

            var column = UserAwareAttribute.GetUserColumnName(expression.Target.ElementType);
            if (!string.IsNullOrEmpty(column))
            {
                // Check that there is an authenticated user in this context
                var identity = System.Threading.Thread.CurrentPrincipal.Identity as System.Security.Claims.ClaimsIdentity;
                if (identity == null)
                {
                    throw new System.Security.SecurityException("Unauthenticated access");
                }
                var userIdclaim = identity.Claims.SingleOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.NameIdentifier);
                if (userIdclaim == null)
                {
                    throw new System.Security.SecurityException("Unauthenticated access");
                }

                // Get the current expression binding 
                var currentExpressionBinding = DbExpressionBuilder.Bind(expression);
                var newFilterExpression = BuildFilterExpression(currentExpressionBinding, column);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return newFilterExpression;
                }
            }

            return expression;
        }
        protected override void OnVisited(DbScanExpression expression)
        {
            EntitySetBase table = expression.Target;

            if (!this.tables.Contains(table))
            {
                this.tables.Add(table);
            }
        }
示例#7
0
        public override void Visit(DbScanExpression e)
        {
            Check.NotNull(e, "e");

            VisitExprKind(e.ExpressionKind);
            _key.Append('(');
            _key.Append(e.Target.EntityContainer.Name);
            _key.Append('.');
            _key.Append(e.Target.Name);
            _key.Append(':');
            _key.Append(e.ResultType.EdmType.Identity);
            _key.Append(')');
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            if (!expression.Target.ElementType.MetadataProperties.Any(mp => mp.Name.EndsWith("customannotation:" + AbpEfConsts.SoftDeleteCustomAnnotationName)))
            {
                return base.Visit(expression);
            }

            var binding = expression.Bind();
            return binding
                .Filter(binding.VariableType.Variable(binding.VariableName)
                    .Property("IsDeleted")//TODO: User may want to bind to another column name. It's better to use actual database column name
                    .Equal(DbExpression.FromBoolean(false)));
        }
示例#9
0
        public override Expression Visit(DbScanExpression expression)
        {
            if (tableProvider == null)
            {
                throw new InvalidOperationException("TableProvider is not set");
            }

            // TODO: make this database independent

            string tableName = expression.Target.GetTableName();
            object table = this.tableProvider.GetTable(tableName);

            return Expression.Constant(table);
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            if (!expression.Target.ElementType.MetadataProperties.Any(mp => mp.Name.EndsWith("customannotation:" + AbpEfConsts.SoftDeleteCustomAnnotationName)))
            {
                return(base.Visit(expression));
            }

            var binding = expression.Bind();

            return(binding
                   .Filter(binding.VariableType.Variable(binding.VariableName)
                           .Property("IsDeleted")//TODO: User may want to bind to another column name. It's better to use actual database column name
                           .Equal(DbExpression.FromBoolean(false))));
        }
        public override Expression Visit(DbScanExpression expression)
        {
            if (tableProvider == null)
            {
                throw new InvalidOperationException("TableProvider is not set");
            }

            // TODO: make this database independent

            string tableName = expression.Target.GetTableName();
            object table     = this.tableProvider.GetTable(tableName);

            return(Expression.Constant(table));
        }
        public static ITable GetTable(
            DbModificationCommandTree commandTree,
            DbContainer container)
        {
            DbScanExpression source = commandTree.Target.Expression as DbScanExpression;

            if (source == null)
            {
                throw new NotSupportedException(
                          "The type of the Target property is not DbScanExpression");
            }

            return(container.Internal.GetTable(source.Target.GetTableName()));
        }
示例#13
0
    public override DbExpression Visit(DbScanExpression expression)
    {
        if (this.FilterValue > 0)
        {
            // Get the current expression
            var dbExpression = base.Visit(expression);
            var binding      = expression.Bind();
            return(binding.Filter(
                       binding.VariableType
                       .Variable(binding.VariableName)
                       .Property("FilterFieldName")
                       .Equal(DbExpression.FromInt32(this.FilterValue))));
        }

        return(base.Visit(expression));
    }
示例#14
0
            public override DbExpression Visit(DbScanExpression expression)
            {
                var table = (EntityType)expression.Target.ElementType;

                if (table.Properties.All(p => p.Name != DeletedColumnName))
                {
                    return(base.Visit(expression));
                }

                var binding = expression.Bind();

                return(binding.Filter(
                           binding.VariableType
                           .Variable(binding.VariableName)
                           .Property(DeletedColumnName).IsNull()));
            }
示例#15
0
        // <summary>
        // Handles extent expressions (these are the terminal nodes in update mapping views). This handler
        // retrieves the changes from the grouper.
        // </summary>
        // <param name="node"> Extent expression node </param>
        public override ChangeNode Visit(DbScanExpression node)
        {
            Check.NotNull(node, "node");

            // Gets modifications requested for this extent from the grouper.
            var extent = node.Target;
            var extentModifications = UpdateTranslator.GetExtentModifications(extent);

            if (null == extentModifications.Placeholder)
            {
                // Bootstrap placeholder (essentially a record for the extent populated with default values).
                extentModifications.Placeholder = ExtentPlaceholderCreator.CreatePlaceholder(extent);
            }

            return(extentModifications);
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = EdmHelper.GetFactoryColumnName(expression.Target.ElementType);

            if (!string.IsNullOrEmpty(column))
            {
                // Get the current expression
                var dbExpression = base.Visit(expression);
                // Get the current expression binding
                var currentExpressionBinding = DbExpressionBuilder.Bind(dbExpression);

                //FactoryId = @Paramname_1
                // Create the variable reference in order to create the property
                var variableReferenceLeftSide = DbExpressionBuilder.Variable(currentExpressionBinding.VariableType,
                                                                             currentExpressionBinding.VariableName);
                // Create the property based on the variable in order to apply the equality
                var tenantPropertyLeftSide = DbExpressionBuilder.Property(variableReferenceLeftSide, column);
                // Create the parameter which is an object representation of a sql parameter.
                // We have to create a parameter and not perform a direct comparison with Equal function for example
                // as this logic is cached per query and called only once
                var tenantParameterLeftSide = DbExpressionBuilder.Parameter(tenantPropertyLeftSide.Property.TypeUsage,
                                                                            FactoryConstants.FactoryIdFilterParameterName);
                // Apply the equality between property and parameter.
                var filterExpressionLeftSide = DbExpressionBuilder.Equal(tenantPropertyLeftSide, tenantParameterLeftSide);

                //1 = @Paramname_2
                // Create the variable reference in order to create the property
                var variableReferenceRightSide = DbExpressionBuilder.Variable(currentExpressionBinding.VariableType,
                                                                              currentExpressionBinding.VariableName);
                // Create the property based on the variable in order to apply the equality
                var tenantPropertyRightSide = DbExpression.FromInt32(1);
                // Create the parameter which is an object representation of a sql parameter.
                // We have to create a parameter and not perform a direct comparison with Equal function for example
                // as this logic is cached per query and called only once
                var tenantParameterRightSide = DbExpressionBuilder.Parameter(TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)),
                                                                             FactoryConstants.FactoryOverrideFilterParameterName);
                // Apply the equality between property and parameter.
                var filterExpressionRightSide = DbExpressionBuilder.Equal(tenantPropertyRightSide, tenantParameterRightSide);
                DbExpressionBuilder.
                var filterExpression = DbExpressionBuilder.Or(filterExpressionLeftSide, filterExpressionRightSide);

                // Apply the filtering to the initial query
                return(DbExpressionBuilder.Filter(currentExpressionBinding, filterExpression));
            }

            return(base.Visit(expression));
        }
示例#17
0
            public override void Visit(DbScanExpression expression)
            {
                Check.NotNull(expression, "expression");

                // we know we won't hit this code unless there is no function defined for this
                // ModificationOperation, so if this EntitySet is using a DefiningQuery, instead
                // of a table, that is an error
                MetadataProperty definingQuery;

                if (expression.Target.MetadataProperties.TryGetValue("DefiningQuery", false, out definingQuery)
                    &&
                    null != definingQuery.Value)
                {
                    string missingCudElement;
                    var    ict = _commandTree as DbInsertCommandTree;
                    var    dct = _commandTree as DbDeleteCommandTree;
#if DEBUG
                    var uct = _commandTree as DbUpdateCommandTree;
#endif

                    if (null != dct)
                    {
                        missingCudElement = "DeleteFunction" /*StorageMslConstructs.DeleteFunctionElement*/;
                    }
                    else if (null != ict)
                    {
                        missingCudElement = "InsertFunction" /*StorageMslConstructs.InsertFunctionElement*/;
                    }
                    else
                    {
#if DEBUG
                        Debug.Assert(null != uct, "did you add a new option?");
#endif

                        missingCudElement = "UpdateFunction" /*StorageMslConstructs.UpdateFunctionElement*/;
                    }
                    throw ADP1.Update(
                              EntityRes.GetString(
                                  EntityRes.Update_SqlEntitySetWithoutDmlFunctions,
                                  expression.Target.Name,
                                  missingCudElement,
                                  "ModificationFunctionMapping" /*StorageMslConstructs.ModificationFunctionMappingElement*/),
                              null);
                }

                _commandText.Append(SqlGenerator.GetTargetTSql(expression.Target));
            }
        public override DbExpression Visit(DbScanExpression expression)
        {
            const string column = "IsActive";

            var table = (EntityType)expression.Target.ElementType;

            if (!table.Properties.Any(p => p.Name == column))
                return base.Visit(expression);

            var binding = expression.Bind();

            return
                binding.Filter(
                    binding.VariableType.Variable(binding.VariableName)
                        .Property(column)
                        .Equal(DbExpression.FromBoolean(true)));
        }
 public override DbExpression Visit(DbScanExpression expression)
 {
     var column = SoftDeleteAttribute.GetSoftDeleteColumnName(expression.Target.ElementType);
     if (column != null) {
         var binding = DbExpressionBuilder.Bind(expression);
         return DbExpressionBuilder.Filter(
             binding,
             DbExpressionBuilder.NotEqual(
                 DbExpressionBuilder.Property(
                 DbExpressionBuilder.Variable(binding.VariableType, binding.VariableName),
                 column),
                 DbExpression.FromBoolean(true)));
     }
     else {
         return base.Visit(expression);
     }
 }
示例#20
0
        public override VisitedExpression Visit(DbPropertyExpression expression)
        {
            DbVariableReferenceExpression variable = expression.Instance as DbVariableReferenceExpression;

            if (variable == null || variable.VariableName != _projectVarName.Peek())
            {
                throw new NotSupportedException();
            }
            if (!_processingReturning)
            {
                return(new PropertyExpression(expression.Property));
            }
            else
            {
                // the table name needs to be quoted, the column name does not.
                // http://archives.postgresql.org/pgsql-bugs/2007-01/msg00102.php
                string tableName = QuoteIdentifier(_variableSubstitution[variable.VariableName]);
                if (variable.VariableName == _commandTree.Target.VariableName)
                {
                    // try to get the table name schema qualified.
                    DbScanExpression scan = _commandTree.Target.Expression as DbScanExpression;
                    if (scan != null)
                    {
#if ENTITIES6
                        System.Data.Entity.Core.Metadata.Edm.MetadataProperty metadata;
#else
                        System.Data.Metadata.Edm.MetadataProperty metadata;
#endif
                        string overrideSchema = "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Schema";
                        if (scan.Target.MetadataProperties.TryGetValue(overrideSchema, false, out metadata) && metadata.Value != null)
                        {
                            tableName = QuoteIdentifier(metadata.Value.ToString()) + "." + tableName;
                        }
                        else if (scan.Target.MetadataProperties.TryGetValue("Schema", false, out metadata) && metadata.Value != null)
                        {
                            tableName = QuoteIdentifier(metadata.Value.ToString()) + "." + tableName;
                        }
                        else
                        {
                            tableName = QuoteIdentifier(scan.Target.EntityContainer.Name) + "." + tableName;
                        }
                    }
                }
                return(new LiteralExpression("currval(pg_get_serial_sequence('" + tableName + "', '" + expression.Property.Name + "'))"));
            }
        }
            public override DbExpression Visit(DbScanExpression expression)
            {
                var table = (EntityType)expression.Target.ElementType;

                if (table.Properties.All(p => p.Name != IsDeletedColumnName) || this.EnableSoftDeleteQuery)
                {
                    return(base.Visit(expression));
                }

                var binding = expression.Bind();

                return(binding.Filter(
                           binding.VariableType
                           .Variable(binding.VariableName)
                           .Property(IsDeletedColumnName)
                           .NotEqual(DbExpression.FromBoolean(true))));
            }
        public override DbExpression Visit(DbScanExpression expression)
        {
            var columnName = SoftDeleteAttribute.GetSoftDeleteColumnName(expression.Target.ElementType);
            var entityType = (EntityType)expression.Target.ElementType;

            if (columnName == null || entityType.Properties.All(p => p.Name != columnName))
            {
                return(base.Visit(expression));
            }

            var binding = expression.Bind();

            return(binding.Filter(
                       binding.VariableType
                       .Variable(binding.VariableName)
                       .Property(columnName)
                       .NotEqual(DbExpression.FromBoolean(true))));
        }
    public override DbExpression Visit(DbScanExpression expression)
    {
        const string NAMESPACE = "OrderTest";

        var type =
            Assembly.GetExecutingAssembly().GetType(string.Format("{0}.{1}", NAMESPACE, expression.Target.Name));

        var attribute =
            type.GetCustomAttributes(typeof(DefaultOrderFieldAttribute)).SingleOrDefault() as
            DefaultOrderFieldAttribute;

        if (attribute != null)
        {
            return(expression.OrderBy(ex => ex.Property(attribute.FieldName)));
        }

        return(expression);
    }
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = TenantAwareAttribute.GetTenantColumnName(expression.Target.ElementType);
            if (!_injectedDynamicFilter && !string.IsNullOrEmpty(column))
            {
                // Get the current expression
                var dbExpression = base.Visit(expression);
                // Get the current expression binding 
                var currentExpressionBinding = DbExpressionBuilder.Bind(dbExpression);
                var newFilterExpression = BuildFilterExpression(currentExpressionBinding, null, column);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return base.Visit(newFilterExpression);
                }
            }

            return base.Visit(expression);
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
            const string column = "IsActive";

            var table = (EntityType)expression.Target.ElementType;

            if (!table.Properties.Any(p => p.Name == column))
            {
                return(base.Visit(expression));
            }

            var binding = expression.Bind();

            return
                (binding.Filter(
                     binding.VariableType.Variable(binding.VariableName)
                     .Property(column)
                     .Equal(DbExpression.FromBoolean(true))));
        }
示例#26
0
            public override void Visit(DbScanExpression expression)
            {
                base.Visit(expression);
                Debug.Assert(null != expression.Target);

                // Verify scan target is in S-space.
                EntitySetBase   target          = expression.Target;
                EntityContainer targetContainer = target.EntityContainer;

                Debug.Assert(null != target.EntityContainer);

                if ((targetContainer.DataSpace != DataSpace.SSpace))
                {
                    _errors.Add(new EdmSchemaError(System.Data.Entity.Strings.Mapping_UnsupportedScanTarget_QueryView(
                                                       _setMapping.Set.Name, target.Name), (int)StorageMappingErrorCode.MappingUnsupportedScanTargetQueryView,
                                                   EdmSchemaErrorSeverity.Error, _setMapping.EntityContainerMapping.SourceLocation, _setMapping.StartLineNumber,
                                                   _setMapping.StartLinePosition));
                }
            }
示例#27
0
        public override SqlFragment Visit(DbScanExpression expression)
        {
            EntitySetBase target   = expression.Target;
            TableFragment fragment = new TableFragment();

            MetadataProperty property;
            bool             propExists = target.MetadataProperties.TryGetValue("DefiningQuery", true, out property);

            if (propExists && property.Value != null)
            {
                MetadataProperty prop2;

                if (target.MetadataProperties.TryGetValue("http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Type", true, out prop2) && (prop2.Value as string == "Views"))

                {
                    // avoid storing view query as DefiningQuery because that hurts query fusing.
                    fragment.Schema = target.MetadataProperties.GetValue("http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Schema", true).Value as string;
                    fragment.Table  = target.Name;
                }
                else
                {
                    fragment.DefiningQuery = new LiteralFragment(property.Value as string);
                }
            }

            else
            {
                fragment.Schema = target.EntityContainer.Name;
                fragment.Table  = target.Name;

                propExists = target.MetadataProperties.TryGetValue("Schema", true, out property);
                if (propExists && property.Value != null)
                {
                    fragment.Schema = property.Value as string;
                }
                propExists = target.MetadataProperties.TryGetValue("Table", true, out property);
                if (propExists && property.Value != null)
                {
                    fragment.Table = property.Value as string;
                }
            }
            return(fragment);
        }
示例#28
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = TenantAwareAttribute.GetTenantColumnName(expression.Target.ElementType);

            if (!_injectedDynamicFilter && !string.IsNullOrEmpty(column))
            {
                // Get the current expression
                var dbExpression = base.Visit(expression);
                // Get the current expression binding
                var currentExpressionBinding = DbExpressionBuilder.Bind(dbExpression);
                var newFilterExpression      = BuildFilterExpression(currentExpressionBinding, null, column);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return(base.Visit(newFilterExpression));
                }
            }

            return(base.Visit(expression));
        }
示例#29
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = ColumnAnnotationAttribute.GetColumnName <TrackDeletedBitAttribute>(expression.Target.ElementType);

            //            var column = TrackDeletedBitAttribute.GetColumnName(expression.Target.ElementType);
            if (column != null)
            {
                var binding = expression.Bind();
                return(binding
                       .Filter(binding.VariableType.Variable(binding.VariableName)
                               .Property(column)
                               .NotEqual(DbExpression.FromBoolean(true))
                               .Or(binding.VariableType.Variable(binding.VariableName)
                                   .Property(column).IsNull())));
            }
            else
            {
                return(base.Visit(expression));
            }
        }
示例#30
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = TenantAwareAttribute.GetColumnName(expression.Target.ElementType);

            if (column != null)
            {
                var binding = DbExpressionBuilder.Bind(expression);
                return(DbExpressionBuilder.Filter(
                           binding,
                           DbExpressionBuilder.NotEqual(
                               DbExpressionBuilder.Property(
                                   DbExpressionBuilder.Variable(binding.VariableType, binding.VariableName),
                                   column),
                               DbExpression.FromInt16(1))));
            }
            else
            {
                return(base.Visit(expression));
            }
        }
示例#31
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            expression = (DbScanExpression)base.Visit(expression);

            var column = UserAwareAttribute.GetUserColumnName(expression.Target.ElementType);

            if (!string.IsNullOrEmpty(column))
            {
                // Check that there is an authenticated user in this context
                var principal = Thread.CurrentPrincipal;

                var identity = principal.Identity as ClaimsIdentity;
                if (identity == null)
                {
                    throw new SecurityException("Unauthenticated access");
                }

                var userIdclaim = identity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
                if (userIdclaim == null)
                {
                    throw new SecurityException("Unauthenticated access");
                }

                // If it's admin, then no need to filter
                if (principal.IsInRole("Administrator"))
                {
                    return(expression);
                }

                // Get the current expression binding
                var currentExpressionBinding = DbExpressionBuilder.Bind(expression);
                var newFilterExpression      = BuildFilterExpression(currentExpressionBinding, column);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return(newFilterExpression);
                }
            }

            return(expression);
        }
            public override DbExpression Visit(DbScanExpression expression)
            {
                var column = SoftDeleteAttribute.GetSoftDeleteColumnName(expression.Target.ElementType);
                if (column != null)
                {
                    var table = (EntityType)expression.Target.ElementType;
                    if (table.Properties.Any(p => p.Name == column))
                    {
                        var binding = expression.Bind();

                        var filter = binding
                            .VariableType
                            .Variable(binding.VariableName)
                            .Property(column)
                            .NotEqual(DbExpression.FromBoolean(true));

                        return binding.Filter(filter);
                    }
                }
                return base.Visit(expression);
            }
示例#33
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            var column = SoftDeleteAttribute.GetSoftDeleteColumnName(expression.Target.ElementType);

            if (column != null)
            {
                var table = (EntityType)expression.Target.ElementType;
                if (table.Properties.Any(p => p.Name == column))
                {
                    var binding = DbExpressionBuilder.Bind(expression);
                    return(DbExpressionBuilder.Filter(
                               binding,
                               DbExpressionBuilder.NotEqual(
                                   DbExpressionBuilder.Property(
                                       DbExpressionBuilder.Variable(binding.VariableType, binding.VariableName),
                                       column),
                                   DbExpression.FromBoolean(true))));
                }
            }
            return(base.Visit(expression));
        }
示例#34
0
        private string CreateNewAlias(DbExpression expr)
        {
            DbScanExpression dbScanExpression = expr as DbScanExpression;

            if (dbScanExpression != null)
            {
                return(dbScanExpression.Target.Name);
            }
            DbPropertyExpression propertyExpression = expr as DbPropertyExpression;

            if (propertyExpression != null)
            {
                return(propertyExpression.Property.Name);
            }
            DbVariableReferenceExpression referenceExpression = expr as DbVariableReferenceExpression;

            if (referenceExpression != null)
            {
                return(referenceExpression.VariableName);
            }
            return(this.GenerateInternalName(string.Empty));
        }
            public override void Visit(DbScanExpression scanExpression)
            {
                DebugCheck.NotNull(scanExpression);

                var tableSql
                    = SqlGenerator.GetTargetTSql(scanExpression.Target)
                      + " AS "
                      + (_currentTableAlias = "t" + _aliasCount++);

                var table = scanExpression.Target.ElementType;

                if (_from.Length == 0)
                {
                    _baseTable = (EntityType)table;

                    _from.Append("FROM ");
                    _from.Append(tableSql);
                }
                else
                {
                    _from.AppendLine();
                    _from.Append("JOIN ");
                    _from.Append(tableSql);
                    _from.Append(" ON ");

                    for (var i = 0; i < table.KeyMembers.Count; i++)
                    {
                        if (i > 0)
                        {
                            _from.Append(" AND ");
                        }

                        _from.Append(_currentTableAlias + ".");
                        _from.Append(SqlGenerator.QuoteIdentifier(table.KeyMembers[i].Name));
                        _from.Append(" = t0.");
                        _from.Append(SqlGenerator.QuoteIdentifier(_baseTable.KeyMembers[i].Name));
                    }
                }
            }
示例#36
0
        public override DbExpression Visit(DbScanExpression expression)
        {

	        var columnName = SoftDeleteAttibute.GetSoftDeleteColumnName(expression.Target.ElementType);

	        if (!string.IsNullOrEmpty(columnName))
	        {
				var table = (EntityType)expression.Target.ElementType;
				if (table.Properties.Any(p => p.Name == columnName))
				{
					var binding = DbExpressionBuilder.Bind(expression);
					return DbExpressionBuilder.Filter(
						binding,
						DbExpressionBuilder.NotEqual(
							DbExpressionBuilder.Property(
								DbExpressionBuilder.Variable(binding.VariableType, binding.VariableName),
								columnName),
							DbExpression.FromBoolean(true)));
				}
			}

	        return base.Visit(expression);
        }
示例#37
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            //  This method will be called for all query expressions.  If there is a filter included (in a .Where() for example),
            //  Visit(DbFilterExpression) will be called first and our dynamic filters will have already been included.
            //  Otherwise, we do that here.

            string entityName = expression.Target.Name;
            var filterList = FindFiltersForEntitySet(expression.Target.ElementType.MetadataProperties, expression.Target.EntityContainer);

            var baseResult = base.Visit(expression);
            if (filterList.Any())
            {
                var binding = DbExpressionBuilder.Bind(baseResult);
                var newFilterExpression = BuildFilterExpressionWithDynamicFilters(entityName, filterList, binding, null);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return newFilterExpression;
                }
            }

            return baseResult;
        }
示例#38
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            expression = (DbScanExpression)base.Visit(expression);

            var column = UserAwareAttribute.GetUserColumnName(expression.Target.ElementType);

            if (!string.IsNullOrEmpty(column))
            {
                // Validate user
                Security.ValidateCurrentUser();

                // Get the current expression binding
                var currentExpressionBinding = DbExpressionBuilder.Bind(expression);
                var newFilterExpression      = BuildFilterExpression(currentExpressionBinding, column);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return(newFilterExpression);
                }
            }

            return(expression);
        }
        public override DbExpression Visit(DbScanExpression expression)
        {
#if DEBUG_VISITS
            System.Diagnostics.Debug.Print("Visit(DbScanExpression): Target.Name={0}", expression.Target.Name);
#endif
            //  If using SSpace:
            //  This method will be called for all query expressions.  If there is a filter included (in a .Where() for example),
            //  Visit(DbFilterExpression) will be called first and our dynamic filters will have already been included.
            //  Otherwise, we do that here.
            //  If using CSpace:
            //  This method will only be called for the initial entity.  Any other references to other entities will be
            //  handled by the Visit(DbPropertyExpression) - this includes filter references and includes.

            var baseResult = base.Visit(expression);
            if (_IgnoreNextDbScan)
            {
                _IgnoreNextDbScan = false;
                return(baseResult);
            }

            string entityName = expression.Target.Name;
            var    filterList = FindFiltersForEntitySet(expression.Target.ElementType.MetadataProperties, expression.Target.EntityContainer);

            if (filterList.Any())
            {
                var binding             = DbExpressionBuilder.Bind(baseResult);
                var newFilterExpression = BuildFilterExpressionWithDynamicFilters(entityName, filterList, binding, null);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return(newFilterExpression);
                }
            }

            return(baseResult);
        }
示例#40
0
        public override DbExpression Visit(DbScanExpression expression)
        {
            //  This method will be called for all query expressions.  If there is a filter included (in a .Where() for example),
            //  Visit(DbFilterExpression) will be called first and our dynamic filters will have already been included.
            //  Otherwise, we do that here.

            string entityName = expression.Target.Name;
            var    filterList = FindFiltersForEntitySet(expression.Target.ElementType.MetadataProperties, expression.Target.EntityContainer);

            var baseResult = base.Visit(expression);

            if (filterList.Any())
            {
                var binding             = DbExpressionBuilder.Bind(baseResult);
                var newFilterExpression = BuildFilterExpressionWithDynamicFilters(entityName, filterList, binding, null);
                if (newFilterExpression != null)
                {
                    //  If not null, a new DbFilterExpression has been created with our dynamic filters.
                    return(newFilterExpression);
                }
            }

            return(baseResult);
        }
示例#41
0
            public override DbExpression Visit(DbScanExpression expression)
            {
                var table = (EntityType)expression.Target.ElementType;

                if (table.Properties.All(p => p.Name != IsDeletedColumnName))
                {
                    return(base.Visit(expression));
                }

                DbExpression newConditionExpression = null;
                var          binding = expression.Bind();

                if (table.Properties.Any(p => p.Name == IsDeletedColumnName))
                {
                    var param          = DbExpression.FromBoolean(false);
                    var columnProperty = DbExpressionBuilder.Property(DbExpressionBuilder.Variable(binding.VariableType, binding.VariableName), IsDeletedColumnName);

                    if ((columnProperty.ResultType.EdmType.FullName == "Edm.Boolean") &&
                        param.ResultType.EdmType.FullName.StartsWith("Oracle", StringComparison.CurrentCultureIgnoreCase) && (param.ResultType.EdmType.Name == "number"))
                    {
                        newConditionExpression = DbExpressionBuilder.Equal(DbExpressionBuilder.CastTo(columnProperty, param.ResultType), param);
                    }
                    else
                    {
                        newConditionExpression = DbExpressionBuilder.Equal(columnProperty, param);
                    }
                }

                return(DbExpressionBuilder.Filter(binding, newConditionExpression));

                //return binding.Filter(
                //    binding.VariableType
                //        .Variable(binding.VariableName)
                //        .Property(IsDeletedColumnName)
                //        .Equal(DbExpression.FromBoolean(false)));
            }
示例#42
0
            /** <inheritdoc /> */
            public override void Visit(DbScanExpression expression)
            {
                _entitySets.Add(expression.Target);

                base.Visit(expression);
            }
示例#43
0
 public override bool Visit(DbScanExpression expression)
 {
     return(false);
 }
示例#44
0
 public override void Visit(DbScanExpression expression)
 {
   string definingQuery = MetadataHelpers.TryGetValueForMetadataProperty<string>(expression.Target, "DefiningQuery");
   if (definingQuery != null)
   {
     throw new NotSupportedException(String.Format("Unable to update the EntitySet '{0}' because it has a DefiningQuery and no <{1}> element exists in the <ModificationFunctionMapping> element to support the current operation.", expression.Target.Name, _kind));
   }
   _commandText.Append(SqlGenerator.GetTargetTSql(expression.Target));
 }
示例#45
0
            public override void Visit(DbScanExpression expression)
            {
                // we know we won't hit this code unless there is no function defined for this
                // ModificationOperation, so if this EntitySet is using a DefiningQuery, instead
                // of a table, that is an error
                if (expression.Target.DefiningQuery != null)
                {
                    string missingCudElement;
                    if (_commandTree.CommandTreeKind == DbCommandTreeKind.Delete)
                    {
                        missingCudElement = StorageMslConstructs.DeleteFunctionElement;
                    }
                    else if (_commandTree.CommandTreeKind == DbCommandTreeKind.Insert)
                    {
                        missingCudElement = StorageMslConstructs.InsertFunctionElement;
                    }
                    else
                    {
                        Debug.Assert(_commandTree.CommandTreeKind == DbCommandTreeKind.Update, "did you add a new option?");
                        missingCudElement = StorageMslConstructs.UpdateFunctionElement;
                    }
                    throw EntityUtil.Update(System.Data.Entity.Strings.Update_SqlEntitySetWithoutDmlFunctions(expression.Target.Name, missingCudElement, StorageMslConstructs.ModificationFunctionMappingElement), null);
                }

                _commandText.Append(SqlGenerator.GetTargetTSql(expression.Target));
            }
 /// <summary>
 ///     Visitor pattern method for DbScanExpression.
 /// </summary>
 /// <param name="expression"> The DbScanExpression that is being visited. </param>
 public abstract void Visit(DbScanExpression expression);
 /// <summary>
 ///     Visitor pattern method for <see cref="DbScanExpression" />.
 /// </summary>
 /// <param name="expression"> The DbScanExpression that is being visited. </param>
 /// <exception cref="ArgumentNullException">
 ///     <paramref name="expression" />
 ///     is null
 /// </exception>
 public override void Visit(DbScanExpression expression)
 {
     Check.NotNull(expression, "expression");
 }
 public override void Visit(DbScanExpression expression) { }
示例#49
0
            public override void Visit(DbScanExpression expression)
            {
                // we know we won't hit this code unless there is no function defined for this
                // ModificationOperation, so if this EntitySet is using a DefiningQuery, instead
                // of a table, that is an error
                if (expression.Target.GetMetadataPropertyValue<string>("DefiningQuery") != null)
                {
                    string missingCudElement;
                    if (_commandTree is DbDeleteCommandTree)
                    {
                        missingCudElement = "DeleteFunction";
                    }
                    else if (_commandTree is DbInsertCommandTree)
                    {
                        missingCudElement = "InsertFunction";
                    }
                    else
                    {
                        Contract.Assert(_commandTree is DbUpdateCommandTree);
                        missingCudElement = "UpdateFunction";
                    }
                    throw new UpdateException(
                        Strings.Update_SqlEntitySetWithoutDmlFunctions(
                            expression.Target.Name, missingCudElement, "ModificationFunctionMapping"));
                }

                _commandText.Append(SqlGenerator.GetTargetTSql(expression.Target));
            }
 public override void Visit(DbScanExpression e)
 {
     Begin(e);
     Begin("Target", "Name", e.Target.Name, "Container", e.Target.EntityContainer.Name);
     Dump(e.Target.ElementType, "TargetElementType");
     End("Target");
     End(e);
 }
 /// <summary>
 /// Implements the visitor pattern for the command tree.
 /// </summary>
 /// <param name="expression">Represents a scan of all elements of a given entity set.</param>
 public override void Visit(DbScanExpression expression)
 {
     var type = getEntityType(expression.Target);
     if (type != null) _entityClrTypes.Add(type);
     base.Visit(expression);
 }
示例#52
0
 /// <summary>
 ///     Visitor pattern method for <see cref="DbScanExpression" />.
 /// </summary>
 /// <param name="expression"> The DbScanExpression that is being visited. </param>
 /// <exception cref="ArgumentNullException">
 ///     <paramref name="expression" />
 ///     is null
 /// </exception>
 public override void Visit(DbScanExpression expression)
 {
     // #433613: PreSharp warning 56506: Parameter 'expression' to this public method must be validated: A null-dereference can occur here.
     Check.NotNull(expression, "expression");
 }
            /// <summary>
            /// Implements the visitor pattern for <see cref="T:System.Data.Common.CommandTrees.DbScanExpression"/>.
            /// </summary>
            /// <param name="expression">The <see cref="T:System.Data.Common.CommandTrees.DbScanExpression"/> that is visited.</param>
            public override void Visit(DbScanExpression expression)
            {
                if (expression == null)
                {
                    throw new ArgumentNullException("expression");
                }

                base.Visit(expression);
                this.affectedEntitySets.Add(expression.Target);
            }
            public override void Visit(DbScanExpression scanExpression)
            {
                DebugCheck.NotNull(scanExpression);

                var tableSql
                    = SqlGenerator.GetTargetTSql(scanExpression.Target)
                      + " AS "
                      + (_currentTableAlias = "t" + _aliasCount++);

                var table = scanExpression.Target.ElementType;

                if (_from.Length == 0)
                {
                    _baseTable = (EntityType)table;

                    _from.Append("FROM ");
                    _from.Append(tableSql);
                }
                else
                {
                    _from.AppendLine();
                    _from.Append("JOIN ");
                    _from.Append(tableSql);
                    _from.Append(" ON ");

                    for (var i = 0; i < table.KeyMembers.Count; i++)
                    {
                        if (i > 0)
                        {
                            _from.Append(" AND ");
                        }

                        _from.Append(_currentTableAlias + ".");
                        _from.Append(SqlGenerator.QuoteIdentifier(table.KeyMembers[i].Name));
                        _from.Append(" = t0.");
                        _from.Append(SqlGenerator.QuoteIdentifier(_baseTable.KeyMembers[i].Name));
                    }
                }
            }
示例#55
0
            /** <inheritdoc /> */
            public override void Visit(DbScanExpression expression)
            {
                _entitySets.Add(expression.Target);

                base.Visit(expression);
            }
		public override void Visit(DbScanExpression expression)
		{
			commandText.Append(SqlGenerator.GetTargetSql(expression.Target));
		}
示例#57
0
 public override DbExpressionEntitySetInfo Visit(DbScanExpression expression)
 {
     return(null);
 }
 public override void Visit(DbScanExpression e)
 {
     VisitExprKind(e.ExpressionKind);
     _key.Append('(');
     _key.Append(e.Target.EntityContainer.Name);
     _key.Append('.');
     _key.Append(e.Target.Name);
     _key.Append(':');
     _key.Append(e.ResultType.EdmType.Identity);
     _key.Append(')');
 }
            public override void Visit(DbScanExpression expression)
            {
                // we know we won't hit this code unless there is no function defined for this
                // ModificationOperation, so if this EntitySet is using a DefiningQuery, instead
                // of a table, that is an error
                MetadataProperty definingQuery;

                if (expression.Target.MetadataProperties.TryGetValue("DefiningQuery", false, out definingQuery)
                    &&
                    null != definingQuery.Value)
                {
                    string missingCudElement;
                    var ict = _commandTree as DbInsertCommandTree;
                    var dct = _commandTree as DbDeleteCommandTree;
#if DEBUG
                    var uct = _commandTree as DbUpdateCommandTree;
#endif

                    if (null != dct)
                    {
                        missingCudElement = "DeleteFunction" /*StorageMslConstructs.DeleteFunctionElement*/;
                    }
                    else if (null != ict)
                    {
                        missingCudElement = "InsertFunction" /*StorageMslConstructs.InsertFunctionElement*/;
                    }
                    else
                    {
#if DEBUG
                        Debug.Assert(null != uct, "did you add a new option?");
#endif

                        missingCudElement = "UpdateFunction" /*StorageMslConstructs.UpdateFunctionElement*/;
                    }
                    throw ADP1.Update(
                        EntityRes.GetString(
                            EntityRes.Update_SqlEntitySetWithoutDmlFunctions,
                            expression.Target.Name,
                            missingCudElement,
                            "ModificationFunctionMapping" /*StorageMslConstructs.ModificationFunctionMappingElement*/),
                        null);
                }

                _commandText.Append(SqlGenerator.GetTargetTSql(expression.Target));
            }
 public override void Visit(DbScanExpression expression)
 {
     Contract.Requires(expression != null);
 }