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 表达式