diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 6ad03cd9..43c2ea14 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.6.5 + 0.6.7 true YeXiangQin FreeSql 扩展包,可实现【延时加载】属性. diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index 6527efef..7f1a36f2 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -258,9 +258,43 @@ namespace FreeSql.Tests { public Templates Templates { get; set; } } + public class SqlFunc { + public static string FormatDateTime() { + return ""; + } + } + [Fact] 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().ToList(a => new { + testaddtime = a.testaddtime.ToString("yyyy-MM-dd HH:mm") + }); + var ttdkdk = g.mysql.Select().Where(a => a.NamespaceName == "ddd").ToSql(); var tsqlddd = g.sqlite.Select().Where(a => diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index e38c5ed5..b0992a4a 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index dcb10d9c..40fae6b3 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -893,12 +893,21 @@ - 按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 }) + 按原生sql语法排序,OrderBy("count(name) + ?cc desc", new { cc = 1 }) sql语法 参数 + + + 按原生sql语法排序,OrderBy(true, "count(name) + ?cc desc", new { cc = 1 }) + + true 时生效 + sql语法 + 参数 + + 查询向后偏移行数 @@ -1230,6 +1239,15 @@ + + + 按列排序,OrderBy(true, a => a.Time) + + + true 时生效 + + + 按列倒向排序,OrderByDescending(a => a.Time) @@ -1237,6 +1255,14 @@ + + + 按列倒向排序,OrderByDescending(true, a => a.Time) + + true 时生效 + 列 + + 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作 diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index 636124c8..d162d72a 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -203,12 +203,20 @@ namespace FreeSql { TSelect Having(string sql, object parms = null); /// - /// 按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 }) + /// 按原生sql语法排序,OrderBy("count(name) + ?cc desc", new { cc = 1 }) /// /// sql语法 /// 参数 /// TSelect OrderBy(string sql, object parms = null); + /// + /// 按原生sql语法排序,OrderBy(true, "count(name) + ?cc desc", new { cc = 1 }) + /// + /// true 时生效 + /// sql语法 + /// 参数 + /// + TSelect OrderBy(bool condition, string sql, object parms = null); /// /// 查询向后偏移行数 diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index 3abdf2ed..0c5f2ce2 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -288,11 +288,26 @@ namespace FreeSql { /// ISelect OrderBy(Expression> column); /// + /// 按列排序,OrderBy(true, a => a.Time) + /// + /// + /// true 时生效 + /// + /// + ISelect OrderBy(bool condition, Expression> column); + /// /// 按列倒向排序,OrderByDescending(a => a.Time) /// /// 列 /// ISelect OrderByDescending(Expression> column); + /// + /// 按列倒向排序,OrderByDescending(true, a => a.Time) + /// + /// true 时生效 + /// 列 + /// + ISelect OrderByDescending(bool condition, Expression> column); /// /// 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作 diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 5225db8d..69aee515 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -929,7 +929,7 @@ namespace FreeSql.Internal { getSelectGroupingMapString = this.getSelectGroupingMapString, tbtype = this.tbtype, isQuoteName = this.isQuoteName, - isDisableDiyParse = false, + isDisableDiyParse = true, style = this.style, currentTable = this.currentTable }; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 9a7fe7c5..bb43b573 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -182,7 +182,9 @@ namespace FreeSql.Internal.CommonProvider { } 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; var isnull = string.IsNullOrEmpty(_orderby); _orderby = string.Concat(isnull ? " \r\nORDER BY " : "", _orderby, isnull ? "" : ", ", sql); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index e66dce58..0f2ee90e 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -40,8 +40,24 @@ namespace FreeSql.Internal.CommonProvider { if (whereIfCond == "1" || whereIfCond == "'t'") this.InternalWhere(expCall.Arguments[1]); break; - case "OrderBy": this.InternalOrderBy(expCall.Arguments[0]); break; - case "OrderByDescending": this.InternalOrderByDescending(expCall.Arguments[0]); break; + case "OrderBy": + 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 "InnerJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.InnerJoin); break; @@ -113,14 +129,15 @@ namespace FreeSql.Internal.CommonProvider { _tables[0].Parameter = column.Parameters[0]; return this.InternalMinAsync(column?.Body); } - - public ISelect OrderBy(Expression> column) { - if (column == null) return this; + public ISelect OrderBy(Expression> column) => this.OrderBy(true, column); + public ISelect OrderBy(bool condition, Expression> column) { + if (condition == false || column == null) return this; _tables[0].Parameter = column.Parameters[0]; return this.InternalOrderBy(column?.Body); } - public ISelect OrderByDescending(Expression> column) { - if (column == null) return this; + public ISelect OrderByDescending(Expression> column) => this.OrderByDescending(true, column); + public ISelect OrderByDescending(bool condition, Expression> column) { + if (condition == false || column == null) return this; _tables[0].Parameter = column.Parameters[0]; return this.InternalOrderByDescending(column?.Body); } diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 8e19a68f..11d633ad 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net452 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 4c50b8dc..ff9c3512 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 01d33495..a995bb46 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql 数据库实现,基于 Oracle 11 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index cc74e43f..17cd460f 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql 数据库实现,基于 PostgreSQL 9.5 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index e8d6d575..a7755327 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -2,7 +2,7 @@ netstandard2.0;net451 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index e58f7ae7..5170bd65 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.6.6 + 0.6.7 true YeXiangQin FreeSql 数据库实现,基于 Sqlite 3.0