diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 02eb0609..27909b2e 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -512,5 +512,14 @@
+
+
+ 批量注入 Repository,可以参考代码自行调整
+
+
+
+
+
+
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 73aed0c3..64cb632a 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
@@ -892,6 +892,17 @@ namespace FreeSql.Tests.MySqlConnector
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM `tb_topic` a
+ORDER BY rand()
+limit 0,10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
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 d3fd2d50..70ab536a 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs
@@ -818,6 +818,16 @@ namespace FreeSql.Tests.Odbc.Dameng
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT t.* FROM (SELECT 1
+FROM ""TB_TOPIC22"" a
+ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs
index d6b8bb72..1d620a53 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs
@@ -783,6 +783,17 @@ namespace FreeSql.Tests.Odbc.KingbaseES
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM ""TB_TOPIC22"" a
+ORDER BY random()
+limit 10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
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 7e1dc423..51f384fb 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
@@ -903,6 +903,17 @@ namespace FreeSql.Tests.Odbc.MySql
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM `tb_topic` a
+ORDER BY rand()
+limit 0,10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
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 6c7bb950..1f89e0b5 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs
@@ -819,6 +819,16 @@ namespace FreeSql.Tests.Odbc.Oracle
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT t.* FROM (SELECT 1
+FROM ""TB_TOPIC22"" a
+ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
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 d1883cf9..12bb9058 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs
@@ -879,6 +879,17 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM ""tb_topic"" a
+ORDER BY random()
+limit 10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
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 20fda333..2b1cd621 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
@@ -774,6 +774,16 @@ namespace FreeSql.Tests.Odbc.SqlServer
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT TOP 10 1
+FROM [tb_topic22] a
+ORDER BY newid()", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
index cf174b9f..ad86186c 100644
--- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
@@ -832,6 +832,16 @@ namespace FreeSql.Tests.Dameng
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT t.* FROM (SELECT 1
+FROM ""TB_TOPIC22"" a
+ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
index 04e9a3d3..5017c5d6 100644
--- a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
@@ -819,6 +819,16 @@ namespace FreeSql.Tests.Firebird
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT FIRST 10 1
+FROM ""TB_TOPIC22"" a
+ORDER BY rand()", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs
index 14a9788a..aae2c4af 100644
--- a/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/KingbaseES/Curd/KingbaseESSelectTest.cs
@@ -783,6 +783,17 @@ namespace FreeSql.Tests.KingbaseES
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM ""TB_TOPIC22"" a
+ORDER BY random()
+limit 10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
index 1f805a2f..ca9dc749 100644
--- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs
@@ -955,6 +955,17 @@ LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM `tb_topic` a
+ORDER BY rand()
+limit 0,10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
index 4aae89fc..618e4fc2 100644
--- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs
@@ -819,6 +819,16 @@ namespace FreeSql.Tests.Oracle
{
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT t.* FROM (SELECT 1
+FROM ""TB_TOPIC22"" a
+ORDER BY dbms_random.value) t WHERE ROWNUM < 11", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
index a522d1e3..41f395e1 100644
--- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs
@@ -896,6 +896,17 @@ namespace FreeSql.Tests.PostgreSQL
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM ""tb_topic"" a
+ORDER BY random()
+limit 10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs
index b6a31412..e5009a88 100644
--- a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs
@@ -897,6 +897,17 @@ namespace FreeSql.Tests.ShenTong
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM ""TB_TOPIC"" a
+ORDER BY random()
+limit 10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
index b8651287..3512f164 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs
@@ -830,6 +830,16 @@ namespace FreeSql.Tests.SqlServer
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT TOP 10 1
+FROM [tb_topic22] a
+ORDER BY newid()", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
index 151a25d5..2c933988 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
@@ -800,6 +800,17 @@ namespace FreeSql.Tests.Sqlite
{
var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
}
+ [Fact]
+ public void OrderByRandom()
+ {
+ var t1 = select.OrderByRandom().Limit(10).ToSql("1");
+ Assert.Equal(@"SELECT 1
+FROM ""tb_topic22"" a
+ORDER BY random()
+limit 0,10", t1);
+ var t2 = select.OrderByRandom().Limit(10).ToList();
+ }
+
[Fact]
public void Skip_Offset()
{
diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
index 53543b56..d692794a 100644
--- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
+++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
@@ -579,4 +579,44 @@ SELECT ");
}
#endregion
+ #region OrderBy Random 随机排序
+
+ ///
+ /// 随机排序
+ /// 支持:MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/金仓/神通
+ /// 不支持:MsAcess
+ ///
+ ///
+ public static TSelect OrderByRandom(this ISelect0 that) where TSelect : class
+ {
+ var s0p = that as Select0Provider;
+ switch (s0p._orm.Ado.DataType)
+ {
+ case DataType.MySql:
+ case DataType.OdbcMySql:
+ return that.OrderBy("rand()");
+ case DataType.SqlServer:
+ case DataType.OdbcSqlServer:
+ return that.OrderBy("newid()");
+ case DataType.PostgreSQL:
+ case DataType.OdbcPostgreSQL:
+ case DataType.KingbaseES:
+ case DataType.OdbcKingbaseES:
+ case DataType.ShenTong:
+ return that.OrderBy("random()");
+ case DataType.Oracle:
+ case DataType.Dameng:
+ case DataType.OdbcOracle:
+ case DataType.OdbcDameng:
+ return that.OrderBy("dbms_random.value");
+ case DataType.Sqlite:
+ return that.OrderBy("random()");
+ //case DataType.MsAccess:
+ // return that.OrderBy("rnd()");
+ case DataType.Firebird:
+ return that.OrderBy("rand()");
+ }
+ throw new NotSupportedException($"{s0p._orm.Ado.DataType} 不支持 OrderByRandom 随机排序");
+ }
+ #endregion
}
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index a03e244a..7f84d792 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -4495,6 +4495,14 @@
递归层级
+
+
+ 随机排序
+ 支持:MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/金仓/神通
+ 不支持:MsAcess
+
+
+
使用 and 拼接两个 lambda 表达式