- 优化 兼容排序 OrderBy(a => new {}) 语法;

This commit is contained in:
2881099 2021-11-22 22:05:32 +08:00
parent b26a581f82
commit e6f05aa24e
3 changed files with 47 additions and 3 deletions

View File

@ -693,6 +693,7 @@ namespace FreeSql.Tests.Sqlite
.Having(a => a.Count() > 0 && a.Avg(a.Key.mod4) > 0 && a.Max(a.Key.mod4) > 0) .Having(a => a.Count() > 0 && a.Avg(a.Key.mod4) > 0 && a.Max(a.Key.mod4) > 0)
.Having(a => a.Count() < 300 || a.Avg(a.Key.mod4) < 100) .Having(a => a.Count() < 300 || a.Avg(a.Key.mod4) < 100)
.OrderBy(a => a.Key.tt2) .OrderBy(a => a.Key.tt2)
.OrderByDescending(a => new { a.Key.tt2, a.Key.mod4 })
.OrderByDescending(a => a.Count()) .OrderByDescending(a => a.Count())
.Offset(10) .Offset(10)
.Limit(2) .Limit(2)
@ -804,7 +805,17 @@ namespace FreeSql.Tests.Sqlite
[Fact] [Fact]
public void OrderBy() public void OrderBy()
{ {
var sql = select.OrderBy(a => new Random().NextDouble()).ToList(); var sql = select.OrderBy(a => new Random().NextDouble()).ToSql();
sql = select.OrderBy(a => a.Id).OrderBy(a => a.Title).OrderByDescending(a => a.CreateTime).ToSql();
Assert.Equal(@"SELECT a.""Id"", a.""Clicks"", a.""TypeGuid"", a.""Title"", a.""CreateTime""
FROM ""tb_topic22"" a
ORDER BY a.""Id"", a.""Title"", a.""CreateTime"" DESC", sql);
sql = select.OrderBy(a => new { a.Id, a.Title }).OrderByDescending(a => a.CreateTime).ToSql();
Assert.Equal(@"SELECT a.""Id"", a.""Clicks"", a.""TypeGuid"", a.""Title"", a.""CreateTime""
FROM ""tb_topic22"" a
ORDER BY a.""Id"", a.""Title"", a.""CreateTime"" DESC", sql);
} }
[Fact] [Fact]
public void OrderByRandom() public void OrderByRandom()

View File

@ -760,8 +760,32 @@ namespace FreeSql.Internal.CommonProvider
_commonExpression.ExpressionJoinLambda(_tables, joinType, exp, null, _whereGlobalFilter); _commonExpression.ExpressionJoinLambda(_tables, joinType, exp, null, _whereGlobalFilter);
return this as TSelect; return this as TSelect;
} }
protected TSelect InternalOrderBy(Expression column) => this.OrderBy(_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null)); protected TSelect InternalOrderBy(Expression column)
protected TSelect InternalOrderByDescending(Expression column) => this.OrderBy($"{_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null)} DESC"); {
if (column.NodeType == ExpressionType.Lambda) column = (column as LambdaExpression)?.Body;
switch (column?.NodeType)
{
case ExpressionType.New:
var newExp = column as NewExpression;
if (newExp == null) break;
for (var a = 0; a < newExp.Members.Count; a++) this.OrderBy(_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, newExp.Arguments[a], true, null));
return this as TSelect;
}
return this.OrderBy(_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null));
}
protected TSelect InternalOrderByDescending(Expression column)
{
if (column.NodeType == ExpressionType.Lambda) column = (column as LambdaExpression)?.Body;
switch (column?.NodeType)
{
case ExpressionType.New:
var newExp = column as NewExpression;
if (newExp == null) break;
for (var a = 0; a < newExp.Members.Count; a++) this.OrderBy($"{_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, newExp.Arguments[a], true, null)} DESC");
return this as TSelect;
}
return this.OrderBy($"{_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null)} DESC");
}
public List<TReturn> InternalToList<TReturn>(Expression select) => this.ToListMapReader<TReturn>(this.GetExpressionField(select)); public List<TReturn> InternalToList<TReturn>(Expression select) => this.ToListMapReader<TReturn>(this.GetExpressionField(select));
protected string InternalToSql<TReturn>(Expression select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex) protected string InternalToSql<TReturn>(Expression select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex)

View File

@ -96,6 +96,15 @@ namespace FreeSql.Internal.CommonProvider
} }
public void InternalOrderBy(Expression exp, bool isDescending) public void InternalOrderBy(Expression exp, bool isDescending)
{ {
if (exp.NodeType == ExpressionType.Lambda) exp = (exp as LambdaExpression)?.Body;
if (exp?.NodeType == ExpressionType.New)
{
var newExp = exp as NewExpression;
if (newExp != null)
for (var a = 0; a < newExp.Members.Count; a++)
InternalOrderBy(newExp.Arguments[a], isDescending);
return;
}
var sql = _comonExp.ExpressionWhereLambda(null, exp, this, null, null); var sql = _comonExp.ExpressionWhereLambda(null, exp, this, null, null);
var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) }); var method = _select.GetType().GetMethod("OrderBy", new[] { typeof(string), typeof(object) });
method.Invoke(_select, new object[] { isDescending ? $"{sql} DESC" : sql, null }); method.Invoke(_select, new object[] { isDescending ? $"{sql} DESC" : sql, null });