- 增加 ISelect.OrderByRandom() 随机排序适配;

This commit is contained in:
2881099 2020-12-24 01:11:28 +08:00
parent ad4fa26818
commit cd6fd2708e
19 changed files with 226 additions and 0 deletions

View File

@ -512,5 +512,14 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -892,6 +892,17 @@ namespace FreeSql.Tests.MySqlConnector
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -818,6 +818,16 @@ namespace FreeSql.Tests.Odbc.Dameng
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -783,6 +783,17 @@ namespace FreeSql.Tests.Odbc.KingbaseES
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -903,6 +903,17 @@ namespace FreeSql.Tests.Odbc.MySql
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -819,6 +819,16 @@ namespace FreeSql.Tests.Odbc.Oracle
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -879,6 +879,17 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -774,6 +774,16 @@ namespace FreeSql.Tests.Odbc.SqlServer
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -832,6 +832,16 @@ namespace FreeSql.Tests.Dameng
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -819,6 +819,16 @@ namespace FreeSql.Tests.Firebird
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -783,6 +783,17 @@ namespace FreeSql.Tests.KingbaseES
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -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(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -819,6 +819,16 @@ namespace FreeSql.Tests.Oracle
{ {
var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -896,6 +896,17 @@ namespace FreeSql.Tests.PostgreSQL
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -897,6 +897,17 @@ namespace FreeSql.Tests.ShenTong
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -830,6 +830,16 @@ namespace FreeSql.Tests.SqlServer
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -800,6 +800,17 @@ namespace FreeSql.Tests.Sqlite
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); 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] [Fact]
public void Skip_Offset() public void Skip_Offset()
{ {

View File

@ -579,4 +579,44 @@ SELECT ");
} }
#endregion #endregion
#region OrderBy Random
/// <summary>
/// 随机排序<para></para>
/// 支持MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/金仓/神通<para></para>
/// 不支持MsAcess
/// </summary>
/// <returns></returns>
public static TSelect OrderByRandom<TSelect, T1>(this ISelect0<TSelect, T1> 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
} }

View File

@ -4495,6 +4495,14 @@
<param name="level">递归层级</param> <param name="level">递归层级</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSqlGlobalExtensions.OrderByRandom``2(FreeSql.ISelect0{``0,``1})">
<summary>
随机排序<para></para>
支持MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/金仓/神通<para></para>
不支持MsAcess
</summary>
<returns></returns>
</member>
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.And``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})"> <member name="M:System.Linq.Expressions.LambadaExpressionExtensions.And``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<summary> <summary>
使用 and 拼接两个 lambda 表达式 使用 and 拼接两个 lambda 表达式