diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index 12a9e174..607046f3 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -44,6 +44,9 @@ namespace FreeSql.Tests { [Fact] public void Test1() { + var sql111 = g.sqlite.Select().AsTable((a, b) => "(select * from TestUser where stringid > 10)").Page(1, 10).ToSql(); + + var xxx = g.sqlite.Select().GroupBy(a => new { a.stringid }).ToList(a => a.Key.stringid); var tuser = g.sqlite.Select().Where(u => u.accname == "admin") diff --git a/FreeSql/MySql/MySqlUtils.cs b/FreeSql/MySql/MySqlUtils.cs index 0fd846f3..6e926867 100644 --- a/FreeSql/MySql/MySqlUtils.cs +++ b/FreeSql/MySql/MySqlUtils.cs @@ -42,7 +42,12 @@ namespace FreeSql.MySql { }); internal override string FormatSql(string sql, params object[] args) => sql?.FormatMySql(args); - internal override string QuoteSqlName(string name) => $"`{name.Trim('`').Replace(".", "`.`")}`"; + internal override string QuoteSqlName(string name) { + var nametrim = name.Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //原生SQL + return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; + } internal override string QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; internal override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; internal override string StringConcat(string left, string right, Type leftType, Type rightType) => $"concat({left}, {right})"; diff --git a/FreeSql/Oracle/OracleUtils.cs b/FreeSql/Oracle/OracleUtils.cs index d5b5d377..e1ea4f42 100644 --- a/FreeSql/Oracle/OracleUtils.cs +++ b/FreeSql/Oracle/OracleUtils.cs @@ -38,7 +38,12 @@ namespace FreeSql.Oracle { }); internal override string FormatSql(string sql, params object[] args) => sql?.FormatOracleSQL(args); - internal override string QuoteSqlName(string name) => $"\"{name.Trim('"').Replace(".", "\".\"")}\""; + internal override string QuoteSqlName(string name) { + var nametrim = name.Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //原生SQL + return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + } internal override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; internal override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; internal override string StringConcat(string left, string right, Type leftType, Type rightType) => $"{left} || {right}"; diff --git a/FreeSql/PostgreSQL/PostgreSQLUtils.cs b/FreeSql/PostgreSQL/PostgreSQLUtils.cs index d689d1d7..b74915a2 100644 --- a/FreeSql/PostgreSQL/PostgreSQLUtils.cs +++ b/FreeSql/PostgreSQL/PostgreSQLUtils.cs @@ -97,7 +97,12 @@ namespace FreeSql.PostgreSQL { }); internal override string FormatSql(string sql, params object[] args) => sql?.FormatPostgreSQL(args); - internal override string QuoteSqlName(string name) => $"\"{name.Trim('"').Replace(".", "\".\"")}\""; + internal override string QuoteSqlName(string name) { + var nametrim = name.Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //原生SQL + return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + } internal override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; internal override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; internal override string StringConcat(string left, string right, Type leftType, Type rightType) => $"{left} || {right}"; diff --git a/FreeSql/SqlServer/SqlServerUtils.cs b/FreeSql/SqlServer/SqlServerUtils.cs index 9705900e..6c65db4a 100644 --- a/FreeSql/SqlServer/SqlServerUtils.cs +++ b/FreeSql/SqlServer/SqlServerUtils.cs @@ -35,7 +35,12 @@ namespace FreeSql.SqlServer { }); internal override string FormatSql(string sql, params object[] args) => sql?.FormatSqlServer(args); - internal override string QuoteSqlName(string name) => $"[{name.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; + internal override string QuoteSqlName(string name) { + var nametrim = name.Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //原生SQL + return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; + } internal override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; internal override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; internal override string StringConcat(string left, string right, Type leftType, Type rightType) => $"{(leftType.FullName == "System.String" ? left : $"cast({left} as nvarchar)")} + {(rightType.FullName == "System.String" ? right : $"cast({right} as nvarchar)")}"; diff --git a/FreeSql/Sqlite/SqliteUtils.cs b/FreeSql/Sqlite/SqliteUtils.cs index 6ff93ed9..3a8bea39 100644 --- a/FreeSql/Sqlite/SqliteUtils.cs +++ b/FreeSql/Sqlite/SqliteUtils.cs @@ -53,7 +53,12 @@ namespace FreeSql.Sqlite { }); internal override string FormatSql(string sql, params object[] args) => sql?.FormatSqlite(args); - internal override string QuoteSqlName(string name) => $"\"{name.Trim('"').Replace(".", "\".\"")}\""; + internal override string QuoteSqlName(string name) { + var nametrim = name.Trim(); + if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) + return nametrim; //原生SQL + return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; + } internal override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; internal override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; internal override string StringConcat(string left, string right, Type leftType, Type rightType) => $"{left} || {right}";