From 9c4ea7ef89ce1216f4ad464a346ea3b313a2efaa Mon Sep 17 00:00:00 2001 From: CLKCLK <617682513@qq.com> Date: Tue, 14 Sep 2021 11:04:53 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20sqlserver=20row=5Fnum?= =?UTF-8?q?ber=E6=8E=92=E5=BA=8F=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sqlserver 使用row_number进行分页时 第一页和后续几页排序不一致的问题 --- .../SqlServer/Curd/OdbcSqlServerSelect.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 342d74ed..8d0870b0 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -41,14 +41,15 @@ namespace FreeSql.Odbc.SqlServer //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); sb.Append(field); + + if (string.IsNullOrEmpty(_orderby)) + { + var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); + if (pktb != null) _orderby = string.Concat(" \r\nORDER BY ", pktb.Alias, ".", _commonUtils.QuoteSqlName(pktb?.Table.Primarys.First().Attribute.Name)); + else _orderby = string.Concat(" \r\nORDER BY ", _tables.First().Alias, ".", _commonUtils.QuoteSqlName(_tables.First().Table.Columns.First().Value.Attribute.Name)); + } if (_skip > 0) { - if (string.IsNullOrEmpty(_orderby)) - { - var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); - if (pktb != null) _orderby = string.Concat(" \r\nORDER BY ", pktb.Alias, ".", _commonUtils.QuoteSqlName(pktb?.Table.Primarys.First().Attribute.Name)); - else _orderby = string.Concat(" \r\nORDER BY ", _tables.First().Alias, ".", _commonUtils.QuoteSqlName(_tables.First().Table.Columns.First().Value.Attribute.Name)); - } sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__"); } sb.Append(" \r\nFROM "); From 5ed9888fa1ab54ba41d1d3016a421f0cf816c04f Mon Sep 17 00:00:00 2001 From: CLKCLK <617682513@qq.com> Date: Tue, 14 Sep 2021 12:04:23 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=5Flimit=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E5=88=A4=E6=96=AD=E4=BE=9D=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用_limit作为判断依据 --- .../SqlServer/Curd/OdbcSqlServerSelect.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 8d0870b0..45c87130 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -42,15 +42,16 @@ namespace FreeSql.Odbc.SqlServer if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); sb.Append(field); - if (string.IsNullOrEmpty(_orderby)) + if (_limit > 0) { - var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); - if (pktb != null) _orderby = string.Concat(" \r\nORDER BY ", pktb.Alias, ".", _commonUtils.QuoteSqlName(pktb?.Table.Primarys.First().Attribute.Name)); - else _orderby = string.Concat(" \r\nORDER BY ", _tables.First().Alias, ".", _commonUtils.QuoteSqlName(_tables.First().Table.Columns.First().Value.Attribute.Name)); - } - if (_skip > 0) - { - sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__"); + if (string.IsNullOrEmpty(_orderby)) + { + var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); + if (pktb != null) _orderby = string.Concat(" \r\nORDER BY ", pktb.Alias, ".", _commonUtils.QuoteSqlName(pktb?.Table.Primarys.First().Attribute.Name)); + else _orderby = string.Concat(" \r\nORDER BY ", _tables.First().Alias, ".", _commonUtils.QuoteSqlName(_tables.First().Table.Columns.First().Value.Attribute.Name)); + } + if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP + sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__"); } sb.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); From 6085fb7e42f8e66570c123b7f8330d38b929379d Mon Sep 17 00:00:00 2001 From: CLKCLK <617682513@qq.com> Date: Tue, 14 Sep 2021 12:04:58 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9:=20row=5Fnumber=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改遗漏的SqlServerSelect --- .../FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs index 25698185..bd1592b3 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs @@ -41,7 +41,8 @@ namespace FreeSql.SqlServer.Curd //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); sb.Append(field); - if (_skip > 0) + + if (_limit > 0) { if (string.IsNullOrEmpty(_orderby)) { @@ -49,7 +50,8 @@ namespace FreeSql.SqlServer.Curd if (pktb != null) _orderby = string.Concat(" \r\nORDER BY ", pktb.Alias, ".", _commonUtils.QuoteSqlName(pktb?.Table.Primarys.First().Attribute.Name)); else _orderby = string.Concat(" \r\nORDER BY ", _tables.First().Alias, ".", _commonUtils.QuoteSqlName(_tables.First().Table.Columns.First().Value.Attribute.Name)); } - sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__"); + if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP + sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__"); } sb.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();