重新定义PageParameter的排序子句,OrderBy优先于Sort,设置Sort时会清空OrderBy
This commit is contained in:
parent
ab8a8366ec
commit
2f3c5d0508
|
@ -38,7 +38,7 @@
|
|||
<ItemGroup>
|
||||
<PackageReference Include="IBM.Data.DB2.Core" Version="3.1.0.600" />
|
||||
<PackageReference Include="MySql.Data" Version="8.3.0" />
|
||||
<PackageReference Include="NewLife.Redis" Version="5.6.2024.105" />
|
||||
<PackageReference Include="NewLife.Redis" Version="5.6.2024.203" />
|
||||
<PackageReference Include="NewLife.Remoting" Version="2.7.2024.202" />
|
||||
<PackageReference Include="NewLife.Stardust" Version="2.9.2024.101" />
|
||||
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.130" />
|
||||
|
|
|
@ -5,7 +5,7 @@ using NewLife.Data;
|
|||
namespace XCode;
|
||||
|
||||
/// <summary>Sql构造器</summary>
|
||||
public class SqlBuilder
|
||||
public static class SqlBuilder
|
||||
{
|
||||
/// <summary>根据排序参数生成排序字句,严格要求排序字段必须是数据字段</summary>
|
||||
/// <param name="page"></param>
|
||||
|
@ -13,9 +13,11 @@ public class SqlBuilder
|
|||
/// <returns></returns>
|
||||
public static String? BuildOrder(PageParameter page, IEntityFactory factory)
|
||||
{
|
||||
var dic = new Dictionary<String, Boolean>();
|
||||
var orderby = page.OrderBy;
|
||||
if (!page.Sort.IsNullOrEmpty() && orderby.StartsWithIgnoreCase(page.Sort))
|
||||
if (!orderby.IsNullOrEmpty()) return orderby;
|
||||
|
||||
var dic = new Dictionary<String, Boolean>();
|
||||
if (!page.Sort.IsNullOrEmpty())
|
||||
{
|
||||
foreach (var item in page.Sort.Split(","))
|
||||
{
|
||||
|
@ -34,25 +36,25 @@ public class SqlBuilder
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (!orderby.IsNullOrEmpty())
|
||||
{
|
||||
foreach (var item in orderby.Split(","))
|
||||
{
|
||||
var line = item.Trim();
|
||||
if (line.EndsWithIgnoreCase(" Desc"))
|
||||
{
|
||||
dic[line.Substring(0, line.Length - 5).Trim()] = true;
|
||||
}
|
||||
else if (line.EndsWithIgnoreCase(" Asc"))
|
||||
{
|
||||
dic[line.Substring(0, line.Length - 4).Trim()] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
dic[line] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
//else if (!orderby.IsNullOrEmpty())
|
||||
//{
|
||||
// foreach (var item in orderby.Split(","))
|
||||
// {
|
||||
// var line = item.Trim();
|
||||
// if (line.EndsWithIgnoreCase(" Desc"))
|
||||
// {
|
||||
// dic[line.Substring(0, line.Length - 5).Trim()] = true;
|
||||
// }
|
||||
// else if (line.EndsWithIgnoreCase(" Asc"))
|
||||
// {
|
||||
// dic[line.Substring(0, line.Length - 4).Trim()] = false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// dic[line] = false;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
if (dic.Count == 0) return orderby;
|
||||
|
||||
|
@ -77,4 +79,19 @@ public class SqlBuilder
|
|||
|
||||
return sb.Put(true);
|
||||
}
|
||||
|
||||
/// <summary>获取排序子句</summary>
|
||||
/// <param name="page"></param>
|
||||
/// <returns></returns>
|
||||
public static String? GetOrderBy(this PageParameter page)
|
||||
{
|
||||
var orderby = page.OrderBy;
|
||||
if (!orderby.IsNullOrEmpty()) return orderby;
|
||||
|
||||
orderby = page.Sort;
|
||||
if (orderby.IsNullOrEmpty()) return orderby;
|
||||
if (page.Desc && !orderby.EndsWithIgnoreCase(" Asc", " Desc")) orderby += " Desc";
|
||||
|
||||
return orderby;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,7 +83,8 @@ public partial class DAL
|
|||
var start = (page.PageIndex - 1) * page.PageSize;
|
||||
var max = page.PageSize;
|
||||
|
||||
if (!page.OrderBy.IsNullOrEmpty()) sql += " order by " + page.OrderBy;
|
||||
var orderby = page.GetOrderBy();
|
||||
if (!orderby.IsNullOrEmpty()) sql += " order by " + orderby;
|
||||
|
||||
return Query<T>(sql, param, start, max);
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="NewLife.Core" Version="10.7.2024.202" />
|
||||
<PackageReference Include="NewLife.Core" Version="10.7.2024.216-beta0739" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Remove="build\**" />
|
||||
|
|
|
@ -45,10 +45,11 @@ public class PageParameterTest
|
|||
{
|
||||
{
|
||||
var pager = new PageParameter();
|
||||
pager.OrderBy = History._.CreateTime;
|
||||
pager.Sort = null;
|
||||
pager.OrderBy = History._.CreateTime;
|
||||
var query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"Order By {History._.CreateTime}"), "单OrderBy出错");
|
||||
//Assert.True(str.Contains($"Order By {History._.CreateTime}"), "单OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime limit 20", str);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -57,7 +58,18 @@ public class PageParameterTest
|
|||
pager.OrderBy = History._.CreateTime;
|
||||
pager.Desc = true; // 无效,Desc只跟Sort配对使用,设置OrderBy后这两个都无效
|
||||
var query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"Order By {History._.CreateTime}"), "单OrderBy出错");
|
||||
//Assert.True(str.Contains($"Order By {History._.CreateTime}"), "单OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime limit 20", str);
|
||||
}
|
||||
|
||||
{
|
||||
// 设置Sort时清空OrderBy
|
||||
var pager = new PageParameter();
|
||||
pager.OrderBy = History._.CreateTime;
|
||||
pager.Sort = null;
|
||||
var query = History.FindAll(null, pager);
|
||||
//Assert.False(str.Contains($"Order By {History._.CreateTime}"), "单OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History limit 20", str);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -70,7 +82,8 @@ public class PageParameterTest
|
|||
pager.Sort = History._.ID;
|
||||
var query = History.FindAll(null, pager);
|
||||
//XTrace.WriteLine($"sql:{str}");
|
||||
Assert.True(str.Contains($"Order By {History._.CreateTime}"), "单OrderBy+单Sort出错");
|
||||
//Assert.True(str.Contains($"Order By {History._.ID}"), "单OrderBy+单Sort出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By ID limit 20", str);
|
||||
}
|
||||
{
|
||||
var pager = new PageParameter();
|
||||
|
@ -79,7 +92,8 @@ public class PageParameterTest
|
|||
pager.Desc = true;
|
||||
var query = History.FindAll(null, pager);
|
||||
//XTrace.WriteLine($"sql:{str}");
|
||||
Assert.True(str.Contains($"Order By {History._.CreateTime} Desc"), "单OrderBy+单Sort出错");
|
||||
//Assert.True(str.Contains($"Order By {History._.CreateTime} Desc"), "单OrderBy+单Sort出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime limit 20", str);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,12 +105,14 @@ public class PageParameterTest
|
|||
pager.OrderBy = $"{History._.CreateTime} desc,{History._.Action} asc";
|
||||
pager.Sort = null;
|
||||
var query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History limit 20", str);
|
||||
|
||||
pager.Sort = null;
|
||||
pager.OrderBy = $"{History._.CreateTime} desc,{History._.Action} asc";
|
||||
pager.OrderBy = $"{History._.CreateTime} desc, {History._.Action} asc";
|
||||
query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime desc, Action asc limit 20", str);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "多OrderBy+单Sort")]
|
||||
|
@ -107,12 +123,14 @@ public class PageParameterTest
|
|||
pager.Sort = History._.ID;
|
||||
|
||||
var query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy+单Sort出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy+单Sort出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By ID limit 20", str);
|
||||
|
||||
pager.Sort = History._.ID;
|
||||
pager.OrderBy = $"{History._.CreateTime} desc,{History._.Action} desc";
|
||||
query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy+单Sort出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime} Desc,[{History._.Action}]"), "多OrderBy+单Sort出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime desc,Action desc limit 20", str);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "多Sort")]
|
||||
|
@ -134,12 +152,14 @@ public class PageParameterTest
|
|||
pager.OrderBy = $"{History._.CreateTime},{History._.Action} asc";
|
||||
pager.Sort = null;
|
||||
var query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History limit 20", str);
|
||||
|
||||
pager.Sort = null;
|
||||
pager.OrderBy = $"{History._.CreateTime},{History._.Action} asc";
|
||||
query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime,Action asc limit 20", str);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "单复杂OrderBy+单sort")]
|
||||
|
@ -149,11 +169,13 @@ public class PageParameterTest
|
|||
pager.OrderBy = $"{History._.CreateTime},{History._.Action} desc";
|
||||
pager.Sort = History._.ID;
|
||||
var query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy+单sort出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy+单sort出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By ID limit 20", str);
|
||||
|
||||
pager.OrderBy = $"{History._.CreateTime},{History._.Action} desc";
|
||||
pager.Sort = History._.ID;
|
||||
pager.OrderBy = $"{History._.CreateTime},{History._.Action} desc";
|
||||
query = History.FindAll(null, pager);
|
||||
Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy+单sort出错");
|
||||
//Assert.True(str.Contains($"{History._.CreateTime},[{History._.Action}]"), "单复杂OrderBy+单sort出错");
|
||||
Assert.Equal("[STOD] Select * From History Order By CreateTime,Action desc limit 20", str);
|
||||
}
|
||||
}
|
|
@ -56,9 +56,9 @@ public class SqlBuilderTests
|
|||
var orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
Assert.Equal("Name", orderby);
|
||||
|
||||
page = new PageParameter { OrderBy = "Name", Desc = true };
|
||||
orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
Assert.Equal("Name Desc", orderby);
|
||||
//page = new PageParameter { OrderBy = "Name", Desc = true };
|
||||
//orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
//Assert.Equal("Name Desc", orderby);
|
||||
|
||||
page = new PageParameter { OrderBy = "Name,Code", Desc = false };
|
||||
orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
|
@ -68,20 +68,20 @@ public class SqlBuilderTests
|
|||
orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
Assert.Equal("Name,Code", orderby);
|
||||
|
||||
page = new PageParameter { OrderBy = "Name desc\n,\nCode", Desc = false };
|
||||
orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
Assert.Equal("Name Desc,Code", orderby);
|
||||
//page = new PageParameter { OrderBy = "Name desc\n,\nCode", Desc = false };
|
||||
//orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
//Assert.Equal("Name Desc,Code", orderby);
|
||||
|
||||
page = new PageParameter { OrderBy = "Name desc\n,\nCode", Desc = true };
|
||||
orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
Assert.Equal("Name Desc,Code", orderby);
|
||||
//page = new PageParameter { OrderBy = "Name desc\n,\nCode", Desc = true };
|
||||
//orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
//Assert.Equal("Name Desc,Code", orderby);
|
||||
|
||||
page = new PageParameter { OrderBy = "name asc\n,\ncode", Desc = true };
|
||||
orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
Assert.Equal("Name,Code", orderby);
|
||||
//page = new PageParameter { OrderBy = "name asc\n,\ncode", Desc = true };
|
||||
//orderby = SqlBuilder.BuildOrder(page, factory);
|
||||
//Assert.Equal("Name,Code", orderby);
|
||||
|
||||
page = new PageParameter { OrderBy = "name2 asc\n,\ncode", Desc = true };
|
||||
var ex = Assert.Throws<XCodeException>(() => SqlBuilder.BuildOrder(page, factory));
|
||||
Assert.Equal("实体类[User]不包含排序字段[name2]", ex.Message);
|
||||
//page = new PageParameter { OrderBy = "name2 asc\n,\ncode", Desc = true };
|
||||
//var ex = Assert.Throws<XCodeException>(() => SqlBuilder.BuildOrder(page, factory));
|
||||
//Assert.Equal("实体类[User]不包含排序字段[name2]", ex.Message);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -117,12 +117,12 @@
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.5" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||
<PackageReference Include="NewLife.IP" Version="2.1.2024.101" />
|
||||
<PackageReference Include="NewLife.UnitTest" Version="1.0.2023.1204" />
|
||||
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
|
||||
<PackageReference Include="xunit" Version="2.6.6" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
|
||||
<PackageReference Include="xunit" Version="2.7.0" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
|
Loading…
Reference in New Issue