mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 优化 兼容排序 OrderBy(a => new {}) 语法;
This commit is contained in:
parent
b26a581f82
commit
e6f05aa24e
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -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 });
|
||||||
|
Loading…
x
Reference in New Issue
Block a user