private string GetTableNameWithQuotes(JoinAttributeBase attrJoin, SqlPropertyMetadata[] props, string tableName)
        {
            switch (Provider)
            {
            case SqlProvider.MSSQL:
                tableName            = "[" + tableName + "]";
                attrJoin.TableName   = GetTableNameWithSchemaPrefix(attrJoin.TableName, attrJoin.TableSchema, "[", "]");
                attrJoin.Key         = "[" + attrJoin.Key + "]";
                attrJoin.ExternalKey = "[" + attrJoin.ExternalKey + "]";
                attrJoin.TableAlias  = string.IsNullOrEmpty(attrJoin.TableAlias) ? string.Empty : "[" + attrJoin.TableAlias + "]";
                foreach (var prop in props)
                {
                    prop.ColumnName = "[" + prop.CleanColumnName + "]";
                }

                break;

            case SqlProvider.MySQL:
                tableName            = "`" + tableName + "`";
                attrJoin.TableName   = GetTableNameWithSchemaPrefix(attrJoin.TableName, attrJoin.TableSchema, "`", "`");
                attrJoin.Key         = "`" + attrJoin.Key + "`";
                attrJoin.ExternalKey = "`" + attrJoin.ExternalKey + "`";
                attrJoin.TableAlias  = string.IsNullOrEmpty(attrJoin.TableAlias) ? string.Empty : "`" + attrJoin.TableAlias + "`";
                foreach (var prop in props)
                {
                    prop.ColumnName = "`" + prop.CleanColumnName + "`";
                }

                break;

            case SqlProvider.SQLite:
                break;

            case SqlProvider.PostgreSQL:
                tableName            = "\"" + tableName + "\"";
                attrJoin.TableName   = GetTableNameWithSchemaPrefix(attrJoin.TableName, attrJoin.TableSchema, "\"", "\"");
                attrJoin.Key         = "\"" + attrJoin.Key + "\"";
                attrJoin.ExternalKey = "\"" + attrJoin.ExternalKey + "\"";
                attrJoin.TableAlias  = string.IsNullOrEmpty(attrJoin.TableAlias) ? string.Empty : "\"" + attrJoin.TableAlias + "\"";
                foreach (var prop in props)
                {
                    prop.ColumnName = "\"" + prop.CleanColumnName + "\"";
                }

                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(Provider));
            }

            return(tableName);
        }
예제 #2
0
        private void AppendJoinQuery(JoinAttributeBase attrJoin, StringBuilder joinBuilder, string tableName)
        {
            var joinString = attrJoin.ToString();
            var joinAs     = Provider == SqlProvider.Oracle ? " " : " AS ";

            if (attrJoin is CrossJoinAttribute)
            {
                joinBuilder.Append(attrJoin.TableAlias == string.Empty
                    ? $"{joinString} {attrJoin.TableName} "
                    : $"{joinString} {attrJoin.TableName}{joinAs}{attrJoin.TableAlias} ");
            }
            else if (attrJoin.TableName != null)
            {
                var customFilter = string.Empty;
                if (JoinsLogicalDelete != null && JoinsLogicalDelete.TryGetValue(attrJoin.TableName, out var deleteAttr))
                {
                    var    colAttr     = deleteAttr.GetCustomAttribute <ColumnAttribute>();
                    var    colName     = colAttr == null ? deleteAttr.Name : colAttr.Name;
                    object deleteValue = 1;
                    if (deleteAttr.PropertyType.IsEnum)
                    {
                        var deleteOption = deleteAttr.PropertyType.GetFields().FirstOrDefault(f => f.GetCustomAttribute <DeletedAttribute>() != null);

                        if (deleteOption != null)
                        {
                            var enumValue = Enum.Parse(deleteAttr.PropertyType, deleteOption.Name);
                            deleteValue = Convert.ChangeType(enumValue, Enum.GetUnderlyingType(deleteAttr.PropertyType));
                        }
                    }

                    customFilter = attrJoin.TableAlias == string.Empty
                        ? $"AND {attrJoin.TableName}.{colName} != {deleteValue} "
                        : $"AND {attrJoin.TableAlias}.{colName} != {deleteValue} ";
                }

                joinBuilder.Append(attrJoin.TableAlias == string.Empty
                    ? $"{joinString} {attrJoin.TableName} ON {tableName}.{attrJoin.Key} = {attrJoin.TableName}.{attrJoin.ExternalKey} {customFilter}"
                    : $"{joinString} {attrJoin.TableName}{joinAs}{attrJoin.TableAlias} ON {tableName}.{attrJoin.Key} = {attrJoin.TableAlias}.{attrJoin.ExternalKey} {customFilter}");
            }
        }