diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs new file mode 100644 index 00000000..0b6c087b --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Issues/1021.cs @@ -0,0 +1,73 @@ +using FreeSql.DataAnnotations; +using FreeSql; +using System; +using System.Collections.Generic; +using Xunit; +using System.Linq; +using Newtonsoft.Json.Linq; +using NpgsqlTypes; +using Npgsql.LegacyPostgis; +using System.Linq.Expressions; +using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; +using System.Threading; +using System.Data.SqlClient; +using kwlib; +using System.Diagnostics; +using System.IO; +using System.Text; + +namespace FreeSql.Tests.Issues +{ + public class _1021 + { + [Fact] + public void PadLeft() + { + var fsql = g.sqlite; + + var list1 = fsql.Select() + .OrderBy(t => t.OldId.PadLeft(4)) + .ToList(r => new sport { id = r.id, name = r.name, OldId = r.OldId.PadLeft(4) }); + /* +SELECT a."id" as1, a."name" as2, padl(a."OldId", 4) as3 +FROM "sport" a +ORDER BY padl(a."OldId", 4) + */ + var list2 = fsql.Select() + .OrderBy(t => t.OldId.PadLeft(2,'0')) + .ToList(r => new sport { id = r.id, name = r.name, OldId = r.OldId.PadLeft(2, '0') }); + /* +SELECT a."id" as1, a."name" as2, leftstr(REPLACE(padl(a."OldId", 2 ), ' ', '0'), 2-length(a."OldId"))||a."OldId" as3 +FROM "sport" a +ORDER BY leftstr(REPLACE(padl(a."OldId", 2 ), ' ', '0'), 2-length(a."OldId"))||a."OldId" + */ + var list3 = fsql.Select() + .OrderBy(t => t.OldId.PadRight(4)) + .ToList(r => new sport { id = r.id, name = r.name, OldId = r.OldId.PadRight(4) }); + /* + SELECT a."id" as1, a."name" as2, padr(a."OldId", 4) as3 +FROM "sport" a +ORDER BY padr(a."OldId", 4) + */ + var list4 = fsql.Select() + .OrderBy(t => t.OldId.PadRight(2, '0')) + .ToList(r => new sport { id = r.id, name = r.name, OldId = r.OldId.PadRight(2, '0') }); + /* + +SELECT a."id" as1, a."name" as2, a."OldId"||rightstr(REPLACE(padr(a."OldId",2),' ','0'),CASE WHEN 2-length(a."OldId")<=0 THEN 0 ELSE 2-length(a."OldId")END) as3 +FROM "sport" a +ORDER BY a."OldId"||rightstr(REPLACE(padr(a."OldId",2),' ','0'),CASE WHEN 2-length(a."OldId")<=0 THEN 0 ELSE 2-length(a."OldId")END) + */ + } + + public class sport + { + public int id { get; set; } + public string name { get; set; } + public string OldId { get; set; } + } + + } + +} diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 7561a490..3192c89a 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -317,11 +317,12 @@ namespace FreeSql.Sqlite //} return $"(instr({left}, {indexOfFindStr})-1)"; case "PadLeft": - if (exp.Arguments.Count == 1) return $"lpad({left}, {getExp(exp.Arguments[0])})"; - return $"lpad({left}, {getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; + if (exp.Arguments.Count == 1) return $"padl({left}, {getExp(exp.Arguments[0])})"; + return $"leftstr(REPLACE(padl({left}, {getExp(exp.Arguments[0])}),' ',{getExp(exp.Arguments[1])}),{getExp(exp.Arguments[0])}-length({left}))||{left}"; case "PadRight": - if (exp.Arguments.Count == 1) return $"rpad({left}, {getExp(exp.Arguments[0])})"; - return $"rpad({left}, {getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})"; + var totalWidthValue = getExp(exp.Arguments[0]); + if (exp.Arguments.Count == 1) return $"padr({left}, {totalWidthValue})"; + return $"{left}||rightstr(REPLACE(padr({left},{totalWidthValue}),' ',{getExp(exp.Arguments[1])}),CASE WHEN {totalWidthValue}-length({left})<=0 THEN 0 ELSE {totalWidthValue}-length({left})END)"; case "Trim": case "TrimStart": case "TrimEnd":