From 1d48f17f813926f4e6b942095111cdec0f0f80ca Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sat, 4 Jul 2020 19:21:22 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20$""=20lambda=20?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 16 --------------- FreeSql.Tests/FreeSql.Tests/UnitTest3.cs | 7 +++++++ FreeSql/Internal/CommonExpression.cs | 26 +++++++++++++++++++++++- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 4854f49c..132d875e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -125,13 +125,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 @@ -486,14 +479,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index 8ea5fe0f..e2b66169 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -159,6 +159,13 @@ namespace FreeSql.Tests [Fact] public void Test03() { + var testStringFormat = g.sqlite.Select().First(a => new { + str = $"x{a.Id}_{DateTime.Now.ToString("yyyyMM")}z", + str2 = string.Format("{0}x{0}_{1}z", a.Id, DateTime.Now.ToString("yyyyMM")) + }); + + + var sql123 = g.sqlserver.Select() .WithSql( diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 8ca5c1c0..9cf22a92 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -716,7 +716,31 @@ namespace FreeSql.Internal string other3Exp = null; switch (callType.FullName) { - case "System.String": other3Exp = ExpressionLambdaToSqlCallString(exp3, tsc); break; + case "System.String": + //$"{id}_{name}" + if (exp3.Method.Name == "Format" && exp3.Object == null && exp3.Arguments[0].NodeType == ExpressionType.Constant) + { + if (exp3.Arguments.Count == 1) return ExpressionLambdaToSql(exp3.Arguments[0], tsc); + var exp3Args0 = (exp3.Arguments[0] as ConstantExpression)?.Value?.ToString().Replace("{{", "{{_freesql_tMp_fLag_"); + var exp3Args1n = exp3.Arguments.Where((a, z) => z > 0).Select(a => ExpressionLambdaToSql(a, tsc)).ToArray(); + var exp3Args0Spt = Regex.Split(exp3Args0, @"{(\d+)}"); + var exp3ArgsConcatType = new Type[exp3Args0Spt.Length]; + exp3Args0Spt[0] = _common.FormatSql("{0}", exp3Args0Spt[0].Replace("{{_freesql_tMp_fLag_", "{{")); + exp3ArgsConcatType[0] = typeof(string); + for (var exp3Args0SptIndex = 1; exp3Args0SptIndex < exp3Args0Spt.Length; exp3Args0SptIndex += 2) + { + var exp3Args1nIndex = int.Parse(exp3Args0Spt[exp3Args0SptIndex]); + exp3Args0Spt[exp3Args0SptIndex] = exp3Args1n[exp3Args1nIndex]; + var expArgsType = exp3.Arguments[exp3Args1nIndex + 1]; + exp3ArgsConcatType[exp3Args0SptIndex] = (expArgsType as UnaryExpression)?.Operand.Type ?? expArgsType.Type; + + exp3Args0Spt[exp3Args0SptIndex + 1] = _common.FormatSql("{0}", exp3Args0Spt[exp3Args0SptIndex + 1].Replace("{{_freesql_tMp_fLag_", "{{")); + exp3ArgsConcatType[exp3Args0SptIndex + 1] = typeof(string); + } + return _common.StringConcat(exp3Args0Spt, exp3ArgsConcatType); + } + other3Exp = ExpressionLambdaToSqlCallString(exp3, tsc); + break; case "System.Math": other3Exp = ExpressionLambdaToSqlCallMath(exp3, tsc); break; case "System.DateTime": other3Exp = ExpressionLambdaToSqlCallDateTime(exp3, tsc); break; case "System.TimeSpan": other3Exp = ExpressionLambdaToSqlCallTimeSpan(exp3, tsc); break;