Skip to content

Commit 16c6fc3

Browse files
2881028810
authored andcommitted
- 增加 ISelect.OrderBy 重载,与 WhereIf 相同行为;
- 修复 Aop.ParseExpression 使用 FreeParse 方法死循环的 bug;
1 parent 0c575c7 commit 16c6fc3

File tree

15 files changed

+121
-19
lines changed

15 files changed

+121
-19
lines changed

Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
5-
<Version>0.6.5</Version>
5+
<Version>0.6.7</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql 扩展包,可实现【延时加载】属性.</Description>

FreeSql.Tests/UnitTest1.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,43 @@ public class TaskBuild {
258258
public Templates Templates { get; set; }
259259
}
260260

261+
public class SqlFunc {
262+
public static string FormatDateTime() {
263+
return "";
264+
}
265+
}
266+
261267
[Fact]
262268
public void Test1() {
263269

270+
g.sqlite.Aop.ParseExpression = (s, e) => {
271+
if (e.Expression.NodeType == ExpressionType.Call) {
272+
var callExp = e.Expression as MethodCallExpression;
273+
if (callExp.Object.Type == typeof(DateTime) &&
274+
callExp.Method.Name == "ToString" &&
275+
callExp.Arguments.Count == 1 &&
276+
callExp.Arguments[0].Type == typeof(string) &&
277+
callExp.Arguments[0].NodeType == ExpressionType.Constant) {
278+
var format = (callExp.Arguments[0] as ConstantExpression)?.Value?.ToString();
279+
280+
if (string.IsNullOrEmpty(format) == false) {
281+
var tmp = e.FreeParse(callExp.Object);
282+
283+
switch(format) {
284+
case "yyyy-MM-dd HH:mm":
285+
tmp = $"date_format({tmp}, '%Y-%m-%d %H:%i')";
286+
break;
287+
}
288+
e.Result = tmp;
289+
}
290+
}
291+
}
292+
};
293+
294+
g.mysql.Select<NewsArticle>().ToList(a => new {
295+
testaddtime = a.testaddtime.ToString("yyyy-MM-dd HH:mm")
296+
});
297+
264298
var ttdkdk = g.mysql.Select<NewsArticle>().Where<TaskBuild>(a => a.NamespaceName == "ddd").ToSql();
265299

266300
var tsqlddd = g.sqlite.Select<NewsArticle>().Where(a =>

FreeSql/FreeSql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
5-
<Version>0.6.6</Version>
5+
<Version>0.6.7</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>

FreeSql/FreeSql.xml

Lines changed: 27 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql/Interface/Curd/ISelect/ISelect0.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,20 @@ public interface ISelect0<TSelect, T1> {
203203
TSelect Having(string sql, object parms = null);
204204

205205
/// <summary>
206-
/// 按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 })
206+
/// 按原生sql语法排序,OrderBy("count(name) + ?cc desc", new { cc = 1 })
207207
/// </summary>
208208
/// <param name="sql">sql语法</param>
209209
/// <param name="parms">参数</param>
210210
/// <returns></returns>
211211
TSelect OrderBy(string sql, object parms = null);
212+
/// <summary>
213+
/// 按原生sql语法排序,OrderBy(true, "count(name) + ?cc desc", new { cc = 1 })
214+
/// </summary>
215+
/// <param name="condition">true 时生效</param>
216+
/// <param name="sql">sql语法</param>
217+
/// <param name="parms">参数</param>
218+
/// <returns></returns>
219+
TSelect OrderBy(bool condition, string sql, object parms = null);
212220

213221
/// <summary>
214222
/// 查询向后偏移行数

FreeSql/Interface/Curd/ISelect/ISelect1.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,26 @@ public interface ISelect<T1> : ISelect0<ISelect<T1>, T1>, ILinqToSql<T1> where T
288288
/// <returns></returns>
289289
ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column);
290290
/// <summary>
291+
/// 按列排序,OrderBy(true, a => a.Time)
292+
/// </summary>
293+
/// <typeparam name="TMember"></typeparam>
294+
/// <param name="condition">true 时生效</param>
295+
/// <param name="column"></param>
296+
/// <returns></returns>
297+
ISelect<T1> OrderBy<TMember>(bool condition, Expression<Func<T1, TMember>> column);
298+
/// <summary>
291299
/// 按列倒向排序,OrderByDescending(a => a.Time)
292300
/// </summary>
293301
/// <param name="column">列</param>
294302
/// <returns></returns>
295303
ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column);
304+
/// <summary>
305+
/// 按列倒向排序,OrderByDescending(true, a => a.Time)
306+
/// </summary>
307+
/// <param name="condition">true 时生效</param>
308+
/// <param name="column">列</param>
309+
/// <returns></returns>
310+
ISelect<T1> OrderByDescending<TMember>(bool condition, Expression<Func<T1, TMember>> column);
296311

297312
/// <summary>
298313
/// 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作

FreeSql/Internal/CommonExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ public ExpTSC CloneDisableDiyParse() {
929929
getSelectGroupingMapString = this.getSelectGroupingMapString,
930930
tbtype = this.tbtype,
931931
isQuoteName = this.isQuoteName,
932-
isDisableDiyParse = false,
932+
isDisableDiyParse = true,
933933
style = this.style,
934934
currentTable = this.currentTable
935935
};

FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,9 @@ public TSelect Master() {
182182
}
183183
public TSelect Offset(int offset) => this.Skip(offset) as TSelect;
184184

185-
public TSelect OrderBy(string sql, object parms = null) {
185+
public TSelect OrderBy(string sql, object parms = null) => this.OrderBy(true, sql, parms);
186+
public TSelect OrderBy(bool condition, string sql, object parms = null) {
187+
if (condition == false) return this as TSelect;
186188
if (string.IsNullOrEmpty(sql)) _orderby = null;
187189
var isnull = string.IsNullOrEmpty(_orderby);
188190
_orderby = string.Concat(isnull ? " \r\nORDER BY " : "", _orderby, isnull ? "" : ", ", sql);

FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,24 @@ protected ISelect<T1> InternalFrom(Expression exp) {
4040
if (whereIfCond == "1" || whereIfCond == "'t'")
4141
this.InternalWhere(expCall.Arguments[1]);
4242
break;
43-
case "OrderBy": this.InternalOrderBy(expCall.Arguments[0]); break;
44-
case "OrderByDescending": this.InternalOrderByDescending(expCall.Arguments[0]); break;
43+
case "OrderBy":
44+
if (expCall.Arguments.Count == 2 && expCall.Arguments[0].Type == typeof(bool)) {
45+
var ifcond = _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, SelectTableInfoType.From, expCall.Arguments[0], false, null);
46+
if (ifcond == "1" || ifcond == "'t'")
47+
this.InternalOrderBy(expCall.Arguments.LastOrDefault());
48+
break;
49+
}
50+
this.InternalOrderBy(expCall.Arguments.LastOrDefault());
51+
break;
52+
case "OrderByDescending":
53+
if (expCall.Arguments.Count == 2 && expCall.Arguments[0].Type == typeof(bool)) {
54+
var ifcond = _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, SelectTableInfoType.From, expCall.Arguments[0], false, null);
55+
if (ifcond == "1" || ifcond == "'t'")
56+
this.InternalOrderByDescending(expCall.Arguments.LastOrDefault());
57+
break;
58+
}
59+
this.InternalOrderByDescending(expCall.Arguments.LastOrDefault());
60+
break;
4561

4662
case "LeftJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.LeftJoin); break;
4763
case "InnerJoin": this.InternalJoin(expCall.Arguments[0], SelectTableInfoType.InnerJoin); break;
@@ -113,14 +129,15 @@ public Task<TMember> MinAsync<TMember>(Expression<Func<T1, TMember>> column) {
113129
_tables[0].Parameter = column.Parameters[0];
114130
return this.InternalMinAsync<TMember>(column?.Body);
115131
}
116-
117-
public ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column) {
118-
if (column == null) return this;
132+
public ISelect<T1> OrderBy<TMember>(Expression<Func<T1, TMember>> column) => this.OrderBy(true, column);
133+
public ISelect<T1> OrderBy<TMember>(bool condition, Expression<Func<T1, TMember>> column) {
134+
if (condition == false || column == null) return this;
119135
_tables[0].Parameter = column.Parameters[0];
120136
return this.InternalOrderBy(column?.Body);
121137
}
122-
public ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column) {
123-
if (column == null) return this;
138+
public ISelect<T1> OrderByDescending<TMember>(Expression<Func<T1, TMember>> column) => this.OrderByDescending(true, column);
139+
public ISelect<T1> OrderByDescending<TMember>(bool condition, Expression<Func<T1, TMember>> column) {
140+
if (condition == false || column == null) return this;
124141
_tables[0].Parameter = column.Parameters[0];
125142
return this.InternalOrderByDescending(column?.Body);
126143
}

Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
5-
<Version>0.6.6</Version>
5+
<Version>0.6.7</Version>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<Authors>YeXiangQin</Authors>
88
<Description>FreeSql 数据库实现,基于 MySql 5.6</Description>

0 commit comments

Comments
 (0)