From cd6fd2708e06fca330a7c6efbb93b6ae0d823198 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Thu, 24 Dec 2020 01:11:28 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20ISelect.OrderByRandom(?=
=?UTF-8?q?)=20=E9=9A=8F=E6=9C=BA=E6=8E=92=E5=BA=8F=E9=80=82=E9=85=8D?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 +++++
.../MySqlConnector/Curd/MySqlSelectTest.cs | 11 +++++
.../Dameng/Curd/DamengSelectTest.cs | 10 +++++
.../KingbaseES/Curd/KingbaseESSelectTest.cs | 11 +++++
.../MySql/Curd/MySqlSelectTest.cs | 11 +++++
.../Oracle/Curd/OracleSelectTest.cs | 10 +++++
.../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 11 +++++
.../SqlServer/Curd/SqlServerSelectTest.cs | 10 +++++
.../Dameng/Curd/DamengSelectTest.cs | 10 +++++
.../Firebird/Curd/FirebirdSelectTest.cs | 10 +++++
.../KingbaseES/Curd/KingbaseESSelectTest.cs | 11 +++++
.../MySql/Curd/MySqlSelectTest.cs | 11 +++++
.../Oracle/Curd/OracleSelectTest.cs | 10 +++++
.../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 11 +++++
.../ShenTong/Curd/ShenTongSelectTest.cs | 11 +++++
.../SqlServer/Curd/SqlServerSelectTest.cs | 10 +++++
.../Sqlite/Curd/SqliteSelectTest.cs | 11 +++++
FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 40 +++++++++++++++++++
FreeSql/FreeSql.xml | 8 ++++
19 files changed, 226 insertions(+)
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 表达式