From 762bd0df2b4334159c35426da1f2423b3af26b76 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Thu, 25 Jul 2019 10:11:50 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20ToList=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E6=9F=A5=E8=AF=A2=E8=B5=8B=E5=80=BCstring.Em?= =?UTF-8?q?pty=E5=90=8E=E4=BA=A7=E7=94=9F=E9=94=99=E8=AF=AF=E7=9A=84SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/UnitTest1.cs | 44 ++++++++++++++++++++---- FreeSql/Internal/CommonExpression.cs | 8 ++++- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index fbdda02a..31210d4f 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -13,6 +13,19 @@ using System.Collections; namespace FreeSql.Tests { + public static class SqlFunc + { + public static T TryTo(this string that) + { + return default(T); + } + + public static string FormatDateTime() + { + return ""; + } + } + public class UnitTest1 { @@ -287,17 +300,32 @@ namespace FreeSql.Tests public TaskBuild Parent { get; set; } } - public class SqlFunc - { - public static string FormatDateTime() - { - return ""; - } - } + + void parseExp(object sender, Aop.ParseExpressionEventArgs e) + { + if (e.Expression.NodeType == ExpressionType.Call) + { + var callExp = e.Expression as MethodCallExpression; + if (callExp.Object == null && callExp.Arguments.Any() && callExp.Arguments[0].Type == typeof(string)) + { + if (callExp.Method.Name == "TryTo") + { + e.Result = Expression.Lambda( + typeof(Func<>).MakeGenericType(callExp.Method.GetGenericArguments().FirstOrDefault()), + e.Expression).Compile().DynamicInvoke()?.ToString(); + return; + } + } + } + } [Fact] public void Test1() { + g.sqlite.Aop.ParseExpression += parseExp; + + var sqddddl = g.sqlite.Select().ToSql(t => t.OptionsEntity04 == "1".TryTo()); + var sqksdkfjl = g.sqlite.Select() .LeftJoin(a => a.Templates.Id2 == a.TemplatesId) .LeftJoin(a => a.Parent.Id == a.Id) @@ -809,6 +837,8 @@ namespace FreeSql.Tests { a.Key.tt2, cou1 = a.Count(), + empty = "", + nil = (string)null, arg1 = a.Avg(a.Key.mod4), ccc2 = a.Key.tt2 ?? "now()", //ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)") diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index cfaf858e..2d7360f5 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -44,7 +44,13 @@ namespace FreeSql.Internal // ccc = "now()", // partby = "sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)" //}),有缺点即 ccc partby 接受类型都是 string,可配合 Convert.ToXxx 类型转换,请看下面的兼容 - parent.DbField = constExp.Type.FullName == "System.String" ? (constExp.Value?.ToString() ?? "NULL") : _common.FormatSql("{0}", constExp?.Value); + if (constExp.Type.FullName == "System.String") + { + var constExpValue = constExp.Value?.ToString() ?? "NULL"; + if (constExpValue == string.Empty) constExpValue = _common.FormatSql("{0}", ""); + parent.DbField = constExpValue; + } else + parent.DbField = _common.FormatSql("{0}", constExp?.Value); field.Append(", ").Append(parent.DbField); if (index >= 0) field.Append(" as").Append(++index); return false;