Exemplo n.º 1
0
        internal Table(SQLiteQueryProvider provider, string name) : base(provider)
        {
            _db  = provider.Database;
            Name = name;

            _primaryKeys = typeof(T).GetRuntimeProperties()
                           .Where(p => !p.IsDefined(typeof(IgnoreAttribute)) && p.IsDefined(typeof(PrimaryKeyAttribute)))
                           .ToArray();
            _otherColumns = typeof(T).GetRuntimeProperties()
                            .Where(p => !p.IsDefined(typeof(IgnoreAttribute)) && !p.IsDefined(typeof(PrimaryKeyAttribute)))
                            .ToArray();

            if (_primaryKeys.Length == 1)
            {
                var property   = _primaryKeys.Single();
                var primaryKey = property.GetCustomAttribute <PrimaryKeyAttribute>();
                if (primaryKey.AutoIncrement)
                {
                    _insertColumns        = _otherColumns;
                    _hasIntegerPrimaryKey = false;
                }
                else
                {
                    _insertColumns        = _primaryKeys.Concat(_otherColumns).ToArray();
                    _hasIntegerPrimaryKey = Orm.IntegralTypes.Contains(property.PropertyType);
                }
            }
            else
            {
                _insertColumns        = _primaryKeys.Concat(_otherColumns).ToArray();
                _hasIntegerPrimaryKey = false;
            }

            if (_primaryKeys.Length + _otherColumns.Length > 0)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("INSERT INTO [").Append(Name).Append("]");
                sb.Append("(");
                foreach (var property in _insertColumns)
                {
                    sb.Append("[").Append(Orm.GetColumnName(property)).Append("]");
                    sb.Append(", ");
                }
                sb.Remove(sb.Length - 2, 2).Append(")");

                sb.Append(" VALUES(")
                .Append(string.Join(", ", Enumerable.Repeat("?", _insertColumns.Length)))
                .Append(");");

                _insertSQL = sb.ToString();
                sb.Insert("INSERT".Length, " OR {0}");
                _insertWithConflictSQL = sb.ToString();
            }

            if (_primaryKeys.Length > 0 && _otherColumns.Length > 0)
            {
                StringBuilder sb = new StringBuilder();

                sb.Append("UPDATE [").Append(Name).Append("] SET ");
                for (int i = 0; i < _otherColumns.Length; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.Append("[").Append(Orm.GetColumnName(_otherColumns[i])).Append("] = ?");
                }

                sb.Append(" WHERE ");
                for (int i = 0; i < _primaryKeys.Length; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(" && ");
                    }
                    sb.Append("[").Append(Orm.GetColumnName(_primaryKeys[i])).Append("] == ?");
                }
                sb.Append(";");

                _updateSQL = sb.ToString();
                sb.Insert("UPDATE".Length, " OR {0}");
                _updateWithConflictSQL = sb.ToString();
            }
        }