- 修复 WithTempQuery + Oracle 分页问题;#1519

This commit is contained in:
2881099 2023-05-23 12:09:19 +08:00
parent 1424649bc3
commit 98c4ce8274
12 changed files with 195 additions and 24 deletions

View File

@ -9,6 +9,44 @@ namespace FreeSql.Tests.SqlServer
{ {
public class SqlServerSelectWithTempQueryTest public class SqlServerSelectWithTempQueryTest
{ {
[Fact]
public void Issues1519()
{
var fsql = g.oracle;
var query = fsql.Select<Issues1510T1>()
.FromQuery(fsql.Select<Issues1510T2>().WithTempQuery(e => e))
.InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
.WithTempQuery(t => new
{
t.t1.Id,
t.t1.Name,
T2Id = t.t2.Id,
T2Name = t.t1.Name,
});
var sql = query.ToSql();
Assert.Equal(sql, @"SELECT *
FROM (
SELECT a.""ID"", a.""NAME"", htb.""ID"" ""T2ID"", a.""NAME"" ""T2NAME""
FROM ""ISSUES1510T1"" a
INNER JOIN (
SELECT a.""ID"", a.""NAME"", a.""T1JOINID""
FROM ""ISSUES1510T2"" a ) htb ON a.""ID"" = htb.""T1JOINID"" ) a");
query.ToList();
query.Page(2, 5);
sql = query.ToSql();
Assert.Equal(sql, @"SELECT t.* FROM (SELECT a.*, ROWNUM AS ""__rownum__""
FROM (
SELECT a.""ID"", a.""NAME"", htb.""ID"" ""T2ID"", a.""NAME"" ""T2NAME""
FROM ""ISSUES1510T1"" a
INNER JOIN (
SELECT a.""ID"", a.""NAME"", a.""T1JOINID""
FROM ""ISSUES1510T2"" a ) htb ON a.""ID"" = htb.""T1JOINID"" ) a
WHERE ROWNUM < 11) t WHERE t.""__rownum__"" > 5");
query.ToList();
}
[Fact] [Fact]
public void Issues1510() public void Issues1510()
{ {

View File

@ -0,0 +1,88 @@
<Playlist Version="2.0">
<Rule Name="Includes" Match="Any">
<Rule Match="All">
<Property Name="Solution" />
<Rule Match="Any">
<Rule Match="All">
<Property Name="Project" Value="FreeSql.Tests" />
<Rule Match="Any">
<Property Name="Namespace" Value="FreeSql.ExpressionTree" />
<Property Name="Namespace" Value="FreeSql.InternalTests" />
<Property Name="Namespace" Value="FreeSql.Tests" />
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.MySqlConnectionExtensions" />
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.NpgsqlConnectionExtensions" />
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.OracleConnectionExtensions" />
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.SqlConnectionExtensions" />
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.SQLiteConnectionExtensions" />
<Property Name="Namespace" Value="FreeSql.Tests.Dameng" />
<Property Name="Namespace" Value="FreeSql.Tests.DamengExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.DamengMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.DataAnnotations" />
<Property Name="Namespace" Value="FreeSql.Tests.DynamicEntity" />
<Property Name="Namespace" Value="FreeSql.Tests.Extensions" />
<Property Name="Namespace" Value="FreeSql.Tests.Firebird" />
<Property Name="Namespace" Value="FreeSql.Tests.FirebirdExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.FirebirdMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Internal" />
<Property Name="Namespace" Value="FreeSql.Tests.Issues" />
<Property Name="Namespace" Value="FreeSql.Tests.Linq" />
<Property Name="Namespace" Value="FreeSql.Tests.MsAccess" />
<Property Name="Namespace" Value="FreeSql.Tests.MsAccessExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.MsAccessMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.MySql" />
<Property Name="Namespace" Value="FreeSql.Tests.MySqlExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.MySqlMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Oracle" />
<Property Name="Namespace" Value="FreeSql.Tests.OracleExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.OracleMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQL" />
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQL.PgArrayToMany" />
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQLExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQLMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Properties" />
<Property Name="Namespace" Value="FreeSql.Tests.Sqlite" />
<Property Name="Namespace" Value="FreeSql.Tests.SqliteExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.SqliteMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.SqlServer" />
<Property Name="Namespace" Value="FreeSql.Tests.SqlServerExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.SqlServerMapType" />
</Rule>
</Rule>
<Property Name="Project" Value="FreeSql.Tests.DbContext" />
<Property Name="Project" Value="FreeSql.Tests.PerformanceTests" />
<Property Name="Project" Value="FreeSql.Tests.Provider.Custom" />
<Property Name="Project" Value="FreeSql.Tests.Provider.MySqlConnector (net6.0)" />
<Property Name="Project" Value="FreeSql.Tests.Provider.MySqlConnector (netcoreapp3.1)" />
<Rule Match="All">
<Property Name="Project" Value="FreeSql.Tests.Provider.Odbc" />
<Rule Match="Any">
<Property Name="Namespace" Value="FreeSql.Tests.Odbc" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.Dameng" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DamengExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DamengMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.Default" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DefaultExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DefaultMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.MySql" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.MySqlExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.MySqlMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.Oracle" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.OracleExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.OracleMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.PostgreSQL" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.PostgreSQLExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.PostgreSQLMapType" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.SqlServer" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.SqlServerExpression" />
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.SqlServerMapType" />
</Rule>
</Rule>
<Property Name="Project" Value="FreeSql.Tests.Provider.OracleOledb (net6.0)" />
<Property Name="Project" Value="FreeSql.Tests.Provider.OracleOledb (netcoreapp3.1)" />
<Property Name="Project" Value="FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite" />
<Property Name="Project" Value="FreeSql.Tests.Provider.Sqlite.Data" />
<Property Name="Project" Value="FreeSql.Tests.VB" />
</Rule>
</Rule>
</Rule>
</Playlist>

View File

@ -188,6 +188,17 @@ namespace FreeSql
expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} <= {expContext.Value.ParsedContent["value2"]}"; expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} <= {expContext.Value.ParsedContent["value2"]}";
return false; return false;
} }
/// <summary>
/// value1 IS NULL
/// </summary>
/// <typeparam name="TValue"></typeparam>
/// <param name="value1"></param>
/// <returns></returns>
public static bool EqualIsNull<TValue>(TValue value1)
{
expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} IS NULL";
return false;
}
#endregion #endregion
/// <summary> /// <summary>

View File

@ -1377,6 +1377,14 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.SqlExt.EqualIsNull``1(``0)">
<summary>
value1 IS NULL
</summary>
<typeparam name="TValue"></typeparam>
<param name="value1"></param>
<returns></returns>
</member>
<member name="M:FreeSql.SqlExt.Case"> <member name="M:FreeSql.SqlExt.Case">
<summary> <summary>
case when .. then .. end case when .. then .. end

View File

@ -32,11 +32,15 @@ namespace FreeSql.Custom.Oracle
sbunion.Append(_select); sbunion.Append(_select);
if (_distinct) sbunion.Append("DISTINCT "); if (_distinct) sbunion.Append("DISTINCT ");
sbunion.Append(field);
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sbunion.Append(field);
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

View File

@ -41,7 +41,7 @@ namespace FreeSql.Custom.SqlServer
if (_distinct) sb.Append("DISTINCT "); if (_distinct) sb.Append("DISTINCT ");
//if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题
if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" ");
sb.Append(field); var rownum = "";
if (_limit > 0 || _skip > 0) if (_limit > 0 || _skip > 0)
{ {
@ -57,11 +57,14 @@ namespace FreeSql.Custom.SqlServer
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY "); _orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
} }
if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP
sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__"); rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__";
} }
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
if (string.IsNullOrEmpty(rownum) == false && field == "*")
sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sb.Append(field).Append(rownum);
sb.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule); var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule);

View File

@ -32,11 +32,14 @@ namespace FreeSql.Dameng.Curd
sbunion.Append(_select); sbunion.Append(_select);
if (_distinct) sbunion.Append("DISTINCT "); if (_distinct) sbunion.Append("DISTINCT ");
sbunion.Append(field);
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sbunion.Append(field);
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

View File

@ -32,11 +32,14 @@ namespace FreeSql.Odbc.Dameng
sbunion.Append(_select); sbunion.Append(_select);
if (_distinct) sbunion.Append("DISTINCT "); if (_distinct) sbunion.Append("DISTINCT ");
sbunion.Append(field);
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sbunion.Append(field);
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

View File

@ -32,11 +32,14 @@ namespace FreeSql.Odbc.Oracle
sbunion.Append(_select); sbunion.Append(_select);
if (_distinct) sbunion.Append("DISTINCT "); if (_distinct) sbunion.Append("DISTINCT ");
sbunion.Append(field);
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sbunion.Append(field);
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

View File

@ -41,7 +41,7 @@ namespace FreeSql.Odbc.SqlServer
if (_distinct) sb.Append("DISTINCT "); if (_distinct) sb.Append("DISTINCT ");
//if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题
if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" ");
sb.Append(field); var rownum = "";
if (_limit > 0 || _skip > 0) if (_limit > 0 || _skip > 0)
{ {
@ -57,11 +57,14 @@ namespace FreeSql.Odbc.SqlServer
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY "); _orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
} }
if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP
sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__"); rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__";
} }
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
if (string.IsNullOrEmpty(rownum) == false && field == "*")
sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sb.Append(field).Append(rownum);
sb.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule); var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule);

View File

@ -32,11 +32,15 @@ namespace FreeSql.Oracle.Curd
sbunion.Append(_select); sbunion.Append(_select);
if (_distinct) sbunion.Append("DISTINCT "); if (_distinct) sbunion.Append("DISTINCT ");
sbunion.Append(field);
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sbunion.Append(field);
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
sbunion.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

View File

@ -41,7 +41,7 @@ namespace FreeSql.SqlServer.Curd
if (_distinct) sb.Append("DISTINCT "); if (_distinct) sb.Append("DISTINCT ");
//if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题
if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" ");
sb.Append(field); var rownum = "";
if (_limit > 0 || _skip > 0) if (_limit > 0 || _skip > 0)
{ {
@ -57,11 +57,14 @@ namespace FreeSql.SqlServer.Curd
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY "); _orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
} }
if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP
sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__"); rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__";
} }
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
if (string.IsNullOrEmpty(rownum) == false && field == "*")
sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
sb.Append(field).Append(rownum);
sb.Append(" \r\nFROM ");
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule); var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule);