Skip to content

Commit

Permalink
重新定义PageParameter的排序子句,OrderBy优先于Sort,设置Sort时会清空OrderBy
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Feb 16, 2024
1 parent ab8a836 commit 2f3c5d0
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 58 deletions.
2 changes: 1 addition & 1 deletion Test/Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
Expand Down
61 changes: 39 additions & 22 deletions XCode/Common/SqlBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,19 @@
namespace XCode;

/// <summary>Sql构造器</summary>
public class SqlBuilder
public static class SqlBuilder
{
/// <summary>根据排序参数生成排序字句,严格要求排序字段必须是数据字段</summary>
/// <param name="page"></param>
/// <param name="factory"></param>
/// <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(","))
{
Expand All @@ -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;

Expand All @@ -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;
}
}
3 changes: 2 additions & 1 deletion XCode/DataAccessLayer/DAL_Mapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ public IEnumerable<T> Query<T>(String sql, Object param, PageParameter page)
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);
}
Expand Down
2 changes: 1 addition & 1 deletion XCode/XCode.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -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\**" />
Expand Down
52 changes: 37 additions & 15 deletions XUnitTest.XCode/Common/PageParameterTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,11 @@ public void SearchData_1()
{
{
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);
}

{
Expand All @@ -57,7 +58,18 @@ public void SearchData_1()
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);
}
}

Expand All @@ -70,7 +82,8 @@ public void SearchData_2()
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();
Expand All @@ -79,7 +92,8 @@ public void SearchData_2()
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);
}
}

Expand All @@ -91,12 +105,14 @@ public void SearchData_3()
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")]
Expand All @@ -107,12 +123,14 @@ public void SearchData_4()
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")]
Expand All @@ -134,12 +152,14 @@ public void SearchData_6()
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")]
Expand All @@ -149,11 +169,13 @@ public void SearchData_7()
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);
}
}
30 changes: 15 additions & 15 deletions XUnitTest.XCode/Common/SqlBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ public void BuildOrder2()
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);
Expand All @@ -68,20 +68,20 @@ public void BuildOrder2()
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);
}
}
6 changes: 3 additions & 3 deletions XUnitTest.XCode/XUnitTest.XCode.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down

0 comments on commit 2f3c5d0

Please sign in to comment.