- 优化 GroupBy Page 未排序的查询;#1126

This commit is contained in:
2881099 2022-05-27 19:17:18 +08:00
parent 5736658e08
commit e50c8ee7cd
2 changed files with 32 additions and 12 deletions

View File

@ -46,9 +46,14 @@ namespace FreeSql.Odbc.SqlServer
{ {
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); if (string.IsNullOrEmpty(_groupby))
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)); 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));
}
else
_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).Append(") AS __rownum__"); sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__");
@ -236,9 +241,14 @@ namespace FreeSql.Odbc.SqlServer
{ {
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); if (string.IsNullOrEmpty(_groupby))
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)); 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));
}
else
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
} }
sb.Append(_orderby).Append($" \r\nOFFSET {_skip} ROW"); sb.Append(_orderby).Append($" \r\nOFFSET {_skip} ROW");
if (_limit > 0) sb.Append($" \r\nFETCH NEXT {_limit} ROW ONLY"); if (_limit > 0) sb.Append($" \r\nFETCH NEXT {_limit} ROW ONLY");

View File

@ -46,9 +46,14 @@ namespace FreeSql.SqlServer.Curd
{ {
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); if (string.IsNullOrEmpty(_groupby))
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)); 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));
}
else
_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).Append(") AS __rownum__"); sb.Append(", ROW_NUMBER() OVER(").Append(_orderby).Append(") AS __rownum__");
@ -236,9 +241,14 @@ namespace FreeSql.SqlServer.Curd
{ {
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
var pktb = _tables.Where(a => a.Table.Primarys.Any()).FirstOrDefault(); if (string.IsNullOrEmpty(_groupby))
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)); 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));
}
else
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
} }
sb.Append(_orderby).Append($" \r\nOFFSET {_skip} ROW"); sb.Append(_orderby).Append($" \r\nOFFSET {_skip} ROW");
if (_limit > 0) sb.Append($" \r\nFETCH NEXT {_limit} ROW ONLY"); if (_limit > 0) sb.Append($" \r\nFETCH NEXT {_limit} ROW ONLY");