diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index dc0203b8..d9f91124 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -110,6 +110,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
index bd98bc2a..cf5f41f3 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
@@ -954,6 +954,21 @@ namespace FreeSql.Tests.MySqlConnector
query = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a) ftb UNION ALLSELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM `tb_topic` a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM `tb_topic` a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
index 57002e1d..5e8e8135 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
@@ -881,6 +881,21 @@ namespace FreeSql.Tests.Odbc.Dameng
query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TiOtmModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
index 1106202b..63a22cb8 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
@@ -850,6 +850,21 @@ namespace FreeSql.Tests.Odbc.Default
query = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22AsTable1] a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a) ftb UNION ALLSELECT * from (SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM [tb_topic22] a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM [tb_topic22] a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
index 88da23e6..75597ce2 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
@@ -965,6 +965,21 @@ namespace FreeSql.Tests.Odbc.MySql
query = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a) ftb UNION ALLSELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM `tb_topic` a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM `tb_topic` a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
index 71a9e93d..363a1548 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
@@ -881,6 +881,21 @@ namespace FreeSql.Tests.Odbc.Oracle
query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TiOtmModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
index d414956c..4599275e 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
@@ -937,6 +937,21 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
query = select.LeftJoin("\"testtypeinfo\" b on b.\"guid\" = a.\"typeguid\" and b.\"name\" = @bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topicastable1\" a LEFT JOIN \"testtypeinfo\" b on b.\"guid\" = a.\"typeguid\" and b.\"name\" = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a) ftb UNION ALLSELECT * from (SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"tb_topic\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"tb_topic\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
index 2fe461ca..e750c5c4 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
@@ -831,6 +831,21 @@ namespace FreeSql.Tests.Odbc.SqlServer
query = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22AsTable1] a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a) ftb UNION ALLSELECT * from (SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM [tb_topic22] a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM [tb_topic22] a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
index ba3ab4af..61555675 100644
--- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
@@ -996,6 +996,21 @@ namespace FreeSql.Tests.MySql
query = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a) ftb UNION ALLSELECT * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM `tb_topic` a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM `tb_topic` a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
index 2e36d4e8..8a194d9d 100644
--- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
@@ -881,6 +881,21 @@ namespace FreeSql.Tests.Oracle
query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TiOtmModel1
diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
index 662c084d..20c1f3b8 100644
--- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
@@ -954,6 +954,21 @@ namespace FreeSql.Tests.PostgreSQL
query = select.LeftJoin("\"testtypeinfo\" b on b.\"guid\" = a.\"typeguid\" and b.\"name\" = @bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topicastable1\" a LEFT JOIN \"testtypeinfo\" b on b.\"guid\" = a.\"typeguid\" and b.\"name\" = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a) ftb UNION ALLSELECT * from (SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topic\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"tb_topic\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"tb_topic\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
index 9adc89d4..8e31fc48 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
@@ -876,6 +876,21 @@ namespace FreeSql.Tests.SqlServer
query = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22AsTable1] a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a) ftb UNION ALLSELECT * from (SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22] a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM [tb_topic22] a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM [tb_topic22] a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
index dfaf65fc..ac2c24a6 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
@@ -865,6 +865,21 @@ namespace FreeSql.Tests.Sqlite
query = select.LeftJoin("\"TestTypeInfo\" b on b.\"Guid\" = a.\"TypeGuid\" and b.\"Name\" = @bname", new { bname = "xxx" }).AsTable(tableRule);
sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22AsTable1\" a LEFT JOIN \"TestTypeInfo\" b on b.\"Guid\" = a.\"TypeGuid\" and b.\"Name\" = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a) ftb UNION ALLSELECT * from (SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"tb_topic22\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"tb_topic22\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index f9ceda03..4346a314 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -2257,193 +2257,7 @@
-
- 可自定义解析表达式
-
-
-
-
- 自定义实体的配置,方便和多个 ORM 共同使用
-
-
-
-
- 自定义实体的属性配置,方便和多个 ORM 共同使用
-
-
-
-
- 增删查改,执行命令之前触发
-
-
-
-
- 增删查改,执行命令完成后触发
-
-
-
-
- CodeFirst迁移,执行之前触发
-
-
-
-
- CodeFirst迁移,执行完成触发
-
-
-
-
- Insert/Update自动值处理
-
-
-
-
- 内置解析功能,可辅助您进行解析
-
-
-
-
- 需要您解析的表达式
-
-
-
-
- 解析后的内容
-
-
-
-
- 实体类型
-
-
-
-
- 实体配置
-
-
-
-
- 索引配置
-
-
-
-
- 实体类型
-
-
-
-
- 实体的属性
-
-
-
-
- 实体的属性配置
-
-
-
-
- 标识符,可将 CurdBefore 与 CurdAfter 进行匹配
-
-
-
-
- 操作类型
-
-
-
-
- 实体类型
-
-
-
-
- 实体类型的元数据
-
-
-
-
- 执行的 SQL
-
-
-
-
- 参数化命令
-
-
-
-
- 发生的错误
-
-
-
-
- 执行SQL命令,返回的结果
-
-
-
-
- 耗时(单位:Ticks)
-
-
-
-
- 耗时(单位:毫秒)
-
-
-
-
- 标识符,可将 SyncStructureBeforeEventArgs 与 SyncStructureAfterEventArgs 进行匹配
-
-
-
-
- 实体类型
-
-
-
-
- 执行的 SQL
-
-
-
-
- 发生的错误
-
-
-
-
- 耗时(单位:Ticks)
-
-
-
-
- 耗时(单位:毫秒)
-
-
-
-
- 类型
-
-
-
-
- 属性列的元数据
-
-
-
-
- 反射的属性信息
-
-
-
-
- 获取实体的属性值,也可以设置实体的属性新值
-
-
-
-
- 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改
+
@@ -3034,3 +2848,160 @@
+unc{``0,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
+
+ 使用 or 拼接两个 lambda 表达式
+
+
+
+ true 时生效
+
+
+
+
+
+ 将 lambda 表达式取反
+
+
+
+ true 时生效
+
+
+
+
+ 生成类似Mongodb的ObjectId有序、不重复Guid
+
+
+
+
+
+ 插入数据
+
+
+
+
+
+
+ 插入数据,传入实体
+
+
+
+
+
+
+
+ 插入数据,传入实体数组
+
+
+
+
+
+
+
+ 插入数据,传入实体集合
+
+
+
+
+
+
+
+ 插入数据,传入实体集合
+
+
+
+
+
+
+
+ 修改数据
+
+
+
+
+
+
+ 修改数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
+
+
+ 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+
+
+ 查询数据
+
+
+
+
+
+
+ 查询数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
+
+
+ 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+
+
+ 删除数据
+
+
+
+
+
+
+ 删除数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
+
+
+ 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
+
+
+
+
+ 开启事务(不支持异步),60秒未执行完成(可能)被其他线程事务自动提交
+
+ 事务体 () => {}
+
+
+
+ 开启事务(不支持异步)
+
+ 超时,未执行完成(可能)被其他线程事务自动提交
+ 事务体 () => {}
+
+
+
+ 开启事务(不支持异步)
+
+
+ 事务体 () => {}
+ 超时,未执行完成(可能)被其他线程事务自动提交
+
+
+
+ 数据库访问对象
+
+
+
+
+ 所有拦截方法都在这里
+
+
+
+
+ CodeFirst 模式开发相关方法
+
+
+
+
+ DbFirst 模式开发相关方法
+
+
+
+
+ 全局过滤设置,可默认附加为 Select/Update/Delete 条件
+
+
+
+
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
index e56102fd..6e2b76ab 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
@@ -155,10 +155,10 @@ namespace FreeSql.Internal.CommonProvider
public bool Any()
{
this.Limit(1);
- return this.ToList("1").FirstOrDefault() == 1;
+ return this.ToList("1 as1").FirstOrDefault() == 1;
}
- public long Count() => this.ToList("count(1)").FirstOrDefault();
+ public long Count() => this.ToList("count(1) as1").FirstOrDefault();
public TSelect Count(out long count)
{
@@ -1023,10 +1023,10 @@ namespace FreeSql.Internal.CommonProvider
}
#region common
- protected TMember InternalAvg(Expression exp) => this.ToList($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault();
- protected TMember InternalMax(Expression exp) => this.ToList($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault();
- protected TMember InternalMin(Expression exp) => this.ToList($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault();
- protected TMember InternalSum(Expression exp) => this.ToList($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault();
+ protected TMember InternalAvg(Expression exp) => this.ToList($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").FirstOrDefault();
+ protected TMember InternalMax(Expression exp) => this.ToList($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").FirstOrDefault();
+ protected TMember InternalMin(Expression exp) => this.ToList($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").FirstOrDefault();
+ protected TMember InternalSum(Expression exp) => this.ToList($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").FirstOrDefault();
protected ISelectGrouping InternalGroupBy(Expression columns)
{
@@ -1104,10 +1104,10 @@ namespace FreeSql.Internal.CommonProvider
async public Task AnyAsync()
{
this.Limit(1);
- return (await this.ToListAsync("1")).FirstOrDefault() == 1;
+ return (await this.ToListAsync("1 as1")).FirstOrDefault() == 1;
}
- async public Task CountAsync() => (await this.ToListAsync("count(1)")).FirstOrDefault();
+ async public Task CountAsync() => (await this.ToListAsync("count(1) as1")).FirstOrDefault();
async public Task ToDataTableAsync(string field = null)
{
@@ -1284,10 +1284,10 @@ namespace FreeSql.Internal.CommonProvider
}
protected Task> ToListMapReaderAsync((ReadAnonymousTypeInfo map, string field) af) => ToListMapReaderPrivateAsync(af, null);
- async protected Task InternalAvgAsync(Expression exp) => (await this.ToListAsync($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault();
- async protected Task InternalMaxAsync(Expression exp) => (await this.ToListAsync($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault();
- async protected Task InternalMinAsync(Expression exp) => (await this.ToListAsync($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault();
- async protected Task InternalSumAsync(Expression exp) => (await this.ToListAsync($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault();
+ async protected Task InternalAvgAsync(Expression exp) => (await this.ToListAsync($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).FirstOrDefault();
+ async protected Task InternalMaxAsync(Expression exp) => (await this.ToListAsync($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).FirstOrDefault();
+ async protected Task InternalMinAsync(Expression exp) => (await this.ToListAsync($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).FirstOrDefault();
+ async protected Task InternalSumAsync(Expression exp) => (await this.ToListAsync($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).FirstOrDefault();
protected Task> InternalToListAsync(Expression select) => this.ToListMapReaderAsync(this.GetExpressionField(select));