protected override SqlStatement ProcessQuery(SqlStatement statement, EvaluationContext context)
            {
                #region Update

                if (statement.QueryType == QueryType.Update || statement.QueryType == QueryType.InsertOrUpdate)
                {
                    var query = statement.SelectQuery !;
                    if (!(query.From.Tables[0].Source is SqlTable source))
                    {
                        return(statement);
                    }

                    var descriptor = MappingSchema.GetEntityDescriptor(source.ObjectType !);
                    if (descriptor == null)
                    {
                        return(statement);
                    }

                    var rowVersion = descriptor.Columns.SingleOrDefault(c => c.MemberAccessor.GetAttribute <RowVersionAttribute>() != null);
                    if (rowVersion == null)
                    {
                        return(statement);
                    }

                    var newStatment = Clone(statement);
                    source = (SqlTable)newStatment.SelectQuery !.From.Tables[0].Source;
                    var field = source[rowVersion.ColumnName] ?? throw new InvalidOperationException();

                    // get real value of RowVersion
                    var updateColumn = newStatment.RequireUpdateClause().Items.FirstOrDefault(ui => ui.Column is SqlField fld && fld.Equals(field));
                    if (updateColumn == null)
                    {
                        updateColumn = new SqlSetExpression(field, field);
                        newStatment.RequireUpdateClause().Items.Add(updateColumn);
                    }

                    updateColumn.Expression = new SqlBinaryExpression(typeof(int), field, "+", new SqlValue(1));

                    return(newStatment);
                }

                #endregion Update

                #region Insert

                else if (statement.QueryType == QueryType.Insert || statement.QueryType == QueryType.InsertOrUpdate)
                {
                    var source     = statement.RequireInsertClause().Into !;
                    var descriptor = MappingSchema.GetEntityDescriptor(source.ObjectType !);
                    var rowVersion = descriptor.Columns.SingleOrDefault(c => c.MemberAccessor.GetAttribute <RowVersionAttribute>() != null);

                    if (rowVersion == null)
                    {
                        return(statement);
                    }


                    var newInsertStatement = Clone(statement);
                    var insertClause       = newInsertStatement.RequireInsertClause();
                    var field = insertClause.Into ![rowVersion.ColumnName] !;
Exemplo n.º 2
0
            protected override SqlStatement ProcessQuery(SqlStatement statement)
            {
                #region Update

                if (statement.QueryType == QueryType.Update || statement.QueryType == QueryType.InsertOrUpdate)
                {
                    var query  = statement.SelectQuery;
                    var source = query.From.Tables[0].Source as SqlTable;
                    if (source == null)
                    {
                        return(statement);
                    }

                    var descriptor = MappingSchema.GetEntityDescriptor(source.ObjectType);
                    if (descriptor == null)
                    {
                        return(statement);
                    }

                    var rowVersion = descriptor.Columns.SingleOrDefault(c => c.MemberAccessor.GetAttribute <RowVersionAttribute>() != null);
                    if (rowVersion == null)
                    {
                        return(statement);
                    }

                    var newStatment = Clone(statement);
                    source = newStatment.SelectQuery.From.Tables[0].Source as SqlTable;
                    var field = source.Fields[rowVersion.ColumnName];

                    // get real value of RowVersion
                    var updateColumn = newStatment.RequireUpdateClause().Items.FirstOrDefault(ui => ui.Column is SqlField && ((SqlField)ui.Column).Equals(field));
                    if (updateColumn == null)
                    {
                        updateColumn = new SqlSetExpression(field, field);
                        newStatment.RequireUpdateClause().Items.Add(updateColumn);
                    }

                    updateColumn.Expression = new SqlBinaryExpression(typeof(int), field, "+", new SqlValue(1));

                    return(newStatment);
                }

                #endregion Update

                #region Insert

                else if (statement.QueryType == QueryType.Insert || statement.QueryType == QueryType.InsertOrUpdate)
                {
                    var source     = statement.RequireInsertClause().Into;
                    var descriptor = MappingSchema.GetEntityDescriptor(source.ObjectType);
                    var rowVersion = descriptor.Columns.SingleOrDefault(c => c.MemberAccessor.GetAttribute <RowVersionAttribute>() != null);

                    if (rowVersion == null)
                    {
                        return(statement);
                    }


                    var newInsertStatement = Clone(statement);
                    var insertClause       = newInsertStatement.RequireInsertClause();
                    var field = insertClause.Into[rowVersion.ColumnName];

                    var versionColumn = (from i in insertClause.Items
                                         let f = i.Column as SqlField
                                                 where f != null && f.PhysicalName == field.PhysicalName
                                                 select i).FirstOrDefault();

                    // if we do not try to insert version, lets suppose it should be done in database
                    if (versionColumn != null)
                    {
                        versionColumn.Expression = new SqlValue(1);
                        return(newInsertStatement);
                    }
                }
                #endregion Insert

                return(statement);
            }