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 c4759737..bd98bc2a 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
@@ -1603,6 +1603,10 @@ namespace FreeSql.Tests.MySqlConnector
public void ForUpdate()
{
var orm = g.mysql;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
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 ceb18b68..57002e1d 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
@@ -1530,6 +1530,10 @@ namespace FreeSql.Tests.Odbc.Dameng
public void ForUpdate()
{
var orm = g.dameng;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
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 07ab8234..1106202b 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
@@ -1341,6 +1341,10 @@ namespace FreeSql.Tests.Odbc.Default
public void ForUpdate()
{
var orm = g.odbc;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
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 51482200..88da23e6 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
@@ -1614,6 +1614,10 @@ namespace FreeSql.Tests.Odbc.MySql
public void ForUpdate()
{
var orm = g.mysql;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
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 0568f121..71a9e93d 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
@@ -1530,6 +1530,10 @@ namespace FreeSql.Tests.Odbc.Oracle
public void ForUpdate()
{
var orm = g.oracle;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
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 faf70373..d414956c 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
@@ -1586,6 +1586,10 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
public void ForUpdate()
{
var orm = g.pgsql;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
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 0d92fd45..2fe461ca 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
@@ -1480,6 +1480,10 @@ namespace FreeSql.Tests.Odbc.SqlServer
public void ForUpdate()
{
var orm = g.sqlserver;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
index 7783236f..ba3ab4af 100644
--- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
@@ -1645,6 +1645,10 @@ namespace FreeSql.Tests.MySql
public void ForUpdate()
{
var orm = g.mysql;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
index bf8cd0a0..2e36d4e8 100644
--- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
@@ -1530,6 +1530,10 @@ namespace FreeSql.Tests.Oracle
public void ForUpdate()
{
var orm = g.oracle;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
index 9308436d..662c084d 100644
--- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
@@ -1603,6 +1603,10 @@ namespace FreeSql.Tests.PostgreSQL
public void ForUpdate()
{
var orm = g.pgsql;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
index 92be87cb..9adc89d4 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
@@ -1548,6 +1548,10 @@ namespace FreeSql.Tests.SqlServer
public void ForUpdate()
{
var orm = g.sqlserver;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
index d0008de7..dfaf65fc 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
@@ -1678,6 +1678,10 @@ namespace FreeSql.Tests.Sqlite
public void ForUpdate()
{
var orm = g.sqlite;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
orm.Transaction(() =>
{
var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 0bac7629..f9ceda03 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -2125,6 +2125,137 @@
+
+
+ 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
+
+
+
+
+
+
+
+
+ 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 在【主库】执行
+
+
+
+
+
+
+
+ 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 在【主库】执行
+
+
+
+
+
+
+
+ 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
+
+
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
+
+
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 })
+
+
+
+
+
+
可自定义解析表达式