mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-18 03:53:21 +08:00
- 增加 ISelect.OrderBy 重载,与 WhereIf 相同行为;
- 修复 Aop.ParseExpression 使用 FreeParse 方法死循环的 bug;
This commit is contained in:
parent
0c575c7b56
commit
16c6fc334b
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
||||||
<Version>0.6.5</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description>
|
<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description>
|
||||||
|
@ -258,9 +258,43 @@ namespace FreeSql.Tests {
|
|||||||
public Templates Templates { get; set; }
|
public Templates Templates { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SqlFunc {
|
||||||
|
public static string FormatDateTime() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Test1() {
|
public void Test1() {
|
||||||
|
|
||||||
|
g.sqlite.Aop.ParseExpression = (s, e) => {
|
||||||
|
if (e.Expression.NodeType == ExpressionType.Call) {
|
||||||
|
var callExp = e.Expression as MethodCallExpression;
|
||||||
|
if (callExp.Object.Type == typeof(DateTime) &&
|
||||||
|
callExp.Method.Name == "ToString" &&
|
||||||
|
callExp.Arguments.Count == 1 &&
|
||||||
|
callExp.Arguments[0].Type == typeof(string) &&
|
||||||
|
callExp.Arguments[0].NodeType == ExpressionType.Constant) {
|
||||||
|
var format = (callExp.Arguments[0] as ConstantExpression)?.Value?.ToString();
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(format) == false) {
|
||||||
|
var tmp = e.FreeParse(callExp.Object);
|
||||||
|
|
||||||
|
switch(format) {
|
||||||
|
case "yyyy-MM-dd HH:mm":
|
||||||
|
tmp = $"date_format({tmp}, '%Y-%m-%d %H:%i')";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
e.Result = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
g.mysql.Select<NewsArticle>().ToList(a => new {
|
||||||
|
testaddtime = a.testaddtime.ToString("yyyy-MM-dd HH:mm")
|
||||||
|
});
|
||||||
|
|
||||||
var ttdkdk = g.mysql.Select<NewsArticle>().Where<TaskBuild>(a => a.NamespaceName == "ddd").ToSql();
|
var ttdkdk = g.mysql.Select<NewsArticle>().Where<TaskBuild>(a => a.NamespaceName == "ddd").ToSql();
|
||||||
|
|
||||||
var tsqlddd = g.sqlite.Select<NewsArticle>().Where(a =>
|
var tsqlddd = g.sqlite.Select<NewsArticle>().Where(a =>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
|
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
|
||||||
|
@ -893,12 +893,21 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="M:FreeSql.ISelect0`2.OrderBy(System.String,System.Object)">
|
<member name="M:FreeSql.ISelect0`2.OrderBy(System.String,System.Object)">
|
||||||
<summary>
|
<summary>
|
||||||
按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 })
|
按原生sql语法排序,OrderBy("count(name) + ?cc desc", new { cc = 1 })
|
||||||
</summary>
|
</summary>
|
||||||
<param name="sql">sql语法</param>
|
<param name="sql">sql语法</param>
|
||||||
<param name="parms">参数</param>
|
<param name="parms">参数</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.ISelect0`2.OrderBy(System.Boolean,System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
按原生sql语法排序,OrderBy(true, "count(name) + ?cc desc", new { cc = 1 })
|
||||||
|
</summary>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="sql">sql语法</param>
|
||||||
|
<param name="parms">参数</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.ISelect0`2.Skip(System.Int32)">
|
<member name="M:FreeSql.ISelect0`2.Skip(System.Int32)">
|
||||||
<summary>
|
<summary>
|
||||||
查询向后偏移行数
|
查询向后偏移行数
|
||||||
@ -1230,6 +1239,15 @@
|
|||||||
<param name="column"></param>
|
<param name="column"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.ISelect`1.OrderBy``1(System.Boolean,System.Linq.Expressions.Expression{System.Func{`0,``0}})">
|
||||||
|
<summary>
|
||||||
|
按列排序,OrderBy(true, a => a.Time)
|
||||||
|
</summary>
|
||||||
|
<typeparam name="TMember"></typeparam>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="column"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.ISelect`1.OrderByDescending``1(System.Linq.Expressions.Expression{System.Func{`0,``0}})">
|
<member name="M:FreeSql.ISelect`1.OrderByDescending``1(System.Linq.Expressions.Expression{System.Func{`0,``0}})">
|
||||||
<summary>
|
<summary>
|
||||||
按列倒向排序,OrderByDescending(a => a.Time)
|
按列倒向排序,OrderByDescending(a => a.Time)
|
||||||
@ -1237,6 +1255,14 @@
|
|||||||
<param name="column">列</param>
|
<param name="column">列</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.ISelect`1.OrderByDescending``1(System.Boolean,System.Linq.Expressions.Expression{System.Func{`0,``0}})">
|
||||||
|
<summary>
|
||||||
|
按列倒向排序,OrderByDescending(true, a => a.Time)
|
||||||
|
</summary>
|
||||||
|
<param name="condition">true 时生效</param>
|
||||||
|
<param name="column">列</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.ISelect`1.Include``1(System.Linq.Expressions.Expression{System.Func{`0,``0}})">
|
<member name="M:FreeSql.ISelect`1.Include``1(System.Linq.Expressions.Expression{System.Func{`0,``0}})">
|
||||||
<summary>
|
<summary>
|
||||||
贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作
|
贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作
|
||||||
|
@ -203,12 +203,20 @@ namespace FreeSql {
|
|||||||
TSelect Having(string sql, object parms = null);
|
TSelect Having(string sql, object parms = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 })
|
/// 按原生sql语法排序,OrderBy("count(name) + ?cc desc", new { cc = 1 })
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sql">sql语法</param>
|
/// <param name="sql">sql语法</param>
|
||||||
/// <param name="parms">参数</param>
|
/// <param name="parms">参数</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
TSelect OrderBy(string sql, object parms = null);
|
TSelect OrderBy(string sql, object parms = null);
|
||||||
|
/// <summary>
|
||||||
|
/// 按原生sql语法排序,OrderBy(true, "count(name) + ?cc desc", new { cc = 1 })
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="condition">true 时生效</param>
|
||||||
|
/// <param name="sql">sql语法</param>
|
||||||
|
/// <param name="parms">参数</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
TSelect OrderBy(bool condition, string sql, object parms = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询向后偏移行数
|
/// 查询向后偏移行数
|
||||||
|
@ -288,11 +288,26 @@ namespace FreeSql {
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column);
|
ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// 按列排序,OrderBy(true, a => a.Time)
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TMember"></typeparam>
|
||||||
|
/// <param name="condition">true 时生效</param>
|
||||||
|
/// <param name="column"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
ISelect<T1> OrderBy<TMember>(bool condition, Expression<Func<T1, TMember>> column);
|
||||||
|
/// <summary>
|
||||||
/// 按列倒向排序,OrderByDescending(a => a.Time)
|
/// 按列倒向排序,OrderByDescending(a => a.Time)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="column">列</param>
|
/// <param name="column">列</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column);
|
ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column);
|
||||||
|
/// <summary>
|
||||||
|
/// 按列倒向排序,OrderByDescending(true, a => a.Time)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="condition">true 时生效</param>
|
||||||
|
/// <param name="column">列</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
ISelect<T1> OrderByDescending<TMember>(bool condition, Expression<Func<T1, TMember>> column);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作
|
/// 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作
|
||||||
|
@ -929,7 +929,7 @@ namespace FreeSql.Internal {
|
|||||||
getSelectGroupingMapString = this.getSelectGroupingMapString,
|
getSelectGroupingMapString = this.getSelectGroupingMapString,
|
||||||
tbtype = this.tbtype,
|
tbtype = this.tbtype,
|
||||||
isQuoteName = this.isQuoteName,
|
isQuoteName = this.isQuoteName,
|
||||||
isDisableDiyParse = false,
|
isDisableDiyParse = true,
|
||||||
style = this.style,
|
style = this.style,
|
||||||
currentTable = this.currentTable
|
currentTable = this.currentTable
|
||||||
};
|
};
|
||||||
|
@ -182,7 +182,9 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}
|
}
|
||||||
public TSelect Offset(int offset) => this.Skip(offset) as TSelect;
|
public TSelect Offset(int offset) => this.Skip(offset) as TSelect;
|
||||||
|
|
||||||
public TSelect OrderBy(string sql, object parms = null) {
|
public TSelect OrderBy(string sql, object parms = null) => this.OrderBy(true, sql, parms);
|
||||||
|
public TSelect OrderBy(bool condition, string sql, object parms = null) {
|
||||||
|
if (condition == false) return this as TSelect;
|
||||||
if (string.IsNullOrEmpty(sql)) _orderby = null;
|
if (string.IsNullOrEmpty(sql)) _orderby = null;
|
||||||
var isnull = string.IsNullOrEmpty(_orderby);
|
var isnull = string.IsNullOrEmpty(_orderby);
|
||||||
_orderby = string.Concat(isnull ? " \r\nORDER BY " : "", _orderby, isnull ? "" : ", ", sql);
|
_orderby = string.Concat(isnull ? " \r\nORDER BY " : "", _orderby, isnull ? "" : ", ", sql);
|
||||||
|
@ -40,8 +40,24 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
if (whereIfCond == "1" || whereIfCond == "'t'")
|
if (whereIfCond == "1" || whereIfCond == "'t'")
|
||||||
this.InternalWhere(expCall.Arguments[1]);
|
this.InternalWhere(expCall.Arguments[1]);
|
||||||
break;
|
break;
|
||||||
case "OrderBy": this.InternalOrderBy(expCall.Arguments[0]); break;
|
case "OrderBy":
|
||||||
case "OrderByDescending": this.InternalOrderByDescending(expCall.Arguments[0]); break;
|
if (expCall.Arguments.Count == 2 && expCall.Arguments[0].Type == typeof(bool)) {
|
||||||
|
var ifcond = _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, SelectTableInfoType.From, expCall.Arguments[0], false, null);
|
||||||
|
if (ifcond == "1" || ifcond == "'t'")
|
||||||
|
this.InternalOrderBy(expCall.Arguments.LastOrDefault());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.InternalOrderBy(expCall.Arguments.LastOrDefault());
|
||||||
|
break;
|
||||||
|
case "OrderByDescending":
|
||||||
|
if (expCall.Arguments.Count == 2 && expCall.Arguments[0].Type == typeof(bool)) {
|
||||||
|
var ifcond = _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, SelectTableInfoType.From, expCall.Arguments[0], false, null);
|
||||||
|
if (ifcond == "1" || ifcond == "'t'")
|
||||||
|
this.InternalOrderByDescending(expCall.Arguments.LastOrDefault());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.InternalOrderByDescending(expCall.Arguments.LastOrDefault());
|
||||||
|
break;
|
||||||
|
|
||||||
case "LeftJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.LeftJoin); break;
|
case "LeftJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.LeftJoin); break;
|
||||||
case "InnerJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.InnerJoin); break;
|
case "InnerJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.InnerJoin); break;
|
||||||
@ -113,14 +129,15 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
_tables[0].Parameter = column.Parameters[0];
|
_tables[0].Parameter = column.Parameters[0];
|
||||||
return this.InternalMinAsync<TMember>(column?.Body);
|
return this.InternalMinAsync<TMember>(column?.Body);
|
||||||
}
|
}
|
||||||
|
public ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column) => this.OrderBy(true, column);
|
||||||
public ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column) {
|
public ISelect<T1> OrderBy<TMember>(bool condition, Expression<Func<T1, TMember>> column) {
|
||||||
if (column == null) return this;
|
if (condition == false || column == null) return this;
|
||||||
_tables[0].Parameter = column.Parameters[0];
|
_tables[0].Parameter = column.Parameters[0];
|
||||||
return this.InternalOrderBy(column?.Body);
|
return this.InternalOrderBy(column?.Body);
|
||||||
}
|
}
|
||||||
public ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column) {
|
public ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column) => this.OrderByDescending(true, column);
|
||||||
if (column == null) return this;
|
public ISelect<T1> OrderByDescending<TMember>(bool condition, Expression<Func<T1, TMember>> column) {
|
||||||
|
if (condition == false || column == null) return this;
|
||||||
_tables[0].Parameter = column.Parameters[0];
|
_tables[0].Parameter = column.Parameters[0];
|
||||||
return this.InternalOrderByDescending(column?.Body);
|
return this.InternalOrderByDescending(column?.Body);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>
|
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>
|
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 Oracle 11</Description>
|
<Description>FreeSql 数据库实现,基于 Oracle 11</Description>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 PostgreSQL 9.5</Description>
|
<Description>FreeSql 数据库实现,基于 PostgreSQL 9.5</Description>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net451</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net451</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next</Description>
|
<Description>FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next</Description>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
|
||||||
<Version>0.6.6</Version>
|
<Version>0.6.7</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 Sqlite 3.0</Description>
|
<Description>FreeSql 数据库实现,基于 Sqlite 3.0</Description>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user