From b069c81f2288ac74eb0e3779807d8390a151d8bf Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 27 Nov 2020 12:10:22 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20=E5=AD=90=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2(=E5=A4=9A=E8=A1=A8)=E5=88=AB=E5=90=8D=EF=BC=9B=20-=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20IUpdate.Set=20=E6=94=AF=E6=8C=81=E4=BD=8D?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=A0=91=E8=A7=A3?= =?UTF-8?q?=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 | 9 -- .../PostgreSQLExpression/MathTest.cs | 26 +++--- .../Sqlite/SqliteCodeFirstTest.cs | 11 +++ FreeSql.Tests/FreeSql.Tests/UnitTest4.cs | 82 +++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 5 +- .../Internal/CommonProvider/UpdateProvider.cs | 7 +- 6 files changed, 116 insertions(+), 24 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index e4208f1f..b3c14870 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -502,14 +502,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/MathTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/MathTest.cs index edc58bd3..ef526b93 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/MathTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/MathTest.cs @@ -78,79 +78,79 @@ namespace FreeSql.Tests.PostgreSQLExpression public void Exp() { var data = new List(); - data.Add(select.Where(a => Math.Exp(1) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Exp(1) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Log() { var data = new List(); - //data.Add(select.Where(a => Math.Log(a.Clicks + 0.5) == a.Clicks + 1).ToList()); + //data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Log(a.Clicks + 0.5) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Log10() { var data = new List(); - //data.Add(select.Where(a => Math.Log10(a.Clicks + 0.5) == a.Clicks + 1).ToList()); + //data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Log10(a.Clicks + 0.5) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Pow() { var data = new List(); - data.Add(select.Where(a => Math.Pow(2, a.Clicks) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Pow(2, a.Clicks) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Sqrt() { var data = new List(); - data.Add(select.Where(a => Math.Sqrt(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Sqrt(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Cos() { var data = new List(); - data.Add(select.Where(a => Math.Cos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Cos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Sin() { var data = new List(); - data.Add(select.Where(a => Math.Sin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Sin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Tan() { var data = new List(); - data.Add(select.Where(a => Math.Tan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Tan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Acos() { var data = new List(); - //data.Add(select.Where(a => Math.Acos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + //data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Acos(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Asin() { var data = new List(); - //data.Add(select.Where(a => Math.Asin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + //data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Asin(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Atan() { var data = new List(); - data.Add(select.Where(a => Math.Atan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Atan(Math.Pow(2, a.Clicks)) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Atan2() { var data = new List(); - data.Add(select.Where(a => Math.Atan2(2, a.Clicks) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Atan2(2, a.Clicks) == a.Clicks + 1).Limit(10).ToList()); } [Fact] public void Truncate() { var data = new List(); - data.Add(select.Where(a => Math.Truncate(a.Clicks * 1.0 / 3) == a.Clicks + 1).ToList()); + data.Add(select.Where(a => a.Clicks < 100).Where(a => Math.Truncate(a.Clicks * 1.0 / 3) == a.Clicks + 1).Limit(10).ToList()); } } } diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs index ab378295..b2a0785f 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs @@ -314,6 +314,17 @@ namespace FreeSql.Tests.Sqlite var itemstb = select.ToDataTable(); } + [Fact] + public void UpdateSetFlag() + { + var sql1 = g.sqlite.Update() + .Set(a => a.Enum2 | TableAllTypeEnumType2.f2) + .Where(a => a.Id == 10) + .ToSql(); + Assert.Equal(@"UPDATE ""tb_alltype"" SET ""Enum2"" = (""Enum2"" | 1), ""DateTime"" = datetime(current_timestamp,'localtime'), ""DateTimeOffSet"" = datetime(current_timestamp,'localtime'), ""DateTimeNullable"" = datetime(current_timestamp,'localtime'), ""DateTimeOffSetNullable"" = datetime(current_timestamp,'localtime') +WHERE (""Id"" = 10)", sql1); + } + [Table(Name = "tb_alltype")] class TableAllType { diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs index 3768615a..608fb115 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs @@ -13,6 +13,88 @@ namespace FreeSql.Tests { public class UnitTest4 { + [Fact] + public void SelectN_SubSelectN() + { + var fsql = g.sqlite; + var plansql1 = fsql.Select() + .LeftJoin((a, b, c, d) => a.pmcode == b.pmcode) + .LeftJoin((a, b, c, d) => b.pmcode == c.pmcode && c.isdefault == 1) + .InnerJoin((a, b, c, d) => c.fvcode == d.fvcode) + .ToSql((a, b, c, d) => new + { + a.billcode, + b.pmname, + d.techcode + }); + + var plansql2 = fsql.Select() + .LeftJoin((a, b, c, d) => a.pmcode == b.pmcode) + .LeftJoin((a, b, c, d) => b.pmcode == c.pmcode && c.isdefault == 1) + .InnerJoin((a, b, c, d) => c.fvcode == d.fvcode) + .ToSql((a, b, c, d) => new + { + a.billcode, + b.pmname, + d.techcode, + planQty = fsql.Select() + .InnerJoin((e, f) => e.code == f.pccode) + .Where((e, f) => a.code == e.plancode) + .Count() + }); + Assert.Equal(@"SELECT a.""billcode"" as1, b.""pmname"" as2, d.""techcode"" as3, (SELECT count(1) + FROM ""ts_tproduct_catering"" e + INNER JOIN ""ts_tproduct_catering_detail"" f ON e.""code"" = f.""pccode"" + WHERE (a.""code"" = e.""plancode"")) as4 +FROM ""ts_tplan"" a +LEFT JOIN ""ts_tproductmode"" b ON a.""pmcode"" = b.""pmcode"" +LEFT JOIN ""ts_tflowversion"" c ON b.""pmcode"" = c.""pmcode"" AND c.""isdefault"" = 1 +INNER JOIN ""ts_tproflow"" d ON c.""fvcode"" = d.""fvcode""", plansql2); + } + class ts_tplan + { + public string code { get; set; } + public string pmcode { get; set; } + public string billcode { get; set; } + } + class ts_tproductmode + { + public string pmcode { get; set; } + public string pmname { get; set; } + } + class ts_tflowversion + { + public string fvcode { get; set; } + public string pmcode { get; set; } + public int isdefault { get; set; } + } + class ts_tproflow + { + public string fvcode { get; set; } + public string techcode { get; set; } + } + class ts_tproduct_catering + { + public string code { get; set; } + public string plancode { get; set; } + } + class ts_tproduct_catering_detail + { + public string pccode { get; set; } + } + class ts_tmain_record + { + public string code { get; set; } + public string barcode { get; set; } + } + class ts_tprocess_record + { + public string mrcode { get; set; } + public string barcode { get; set; } + public string techcode { get; set; } + public int assemres { get; set; } + } + class ts_lawsuit { public Guid id { get; set; } diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 3e7ea011..22af9661 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1009,8 +1009,11 @@ namespace FreeSql.Internal { if (fsqltable1SetAlias == false) { - fsqltables[0].Alias = (argExp as LambdaExpression).Parameters.First().Name; fsqltable1SetAlias = true; + var argExpLambda = argExp as LambdaExpression; + var fsqlTypeGenericArgs = fsqlType.GetGenericArguments(); + for (var gai = 0; gai < fsqlTypeGenericArgs.Length && gai < argExpLambda.Parameters.Count; gai++) + fsqltables[gai].Alias = argExpLambda.Parameters[gai].Name; } } args[a] = argExp ?? Expression.Lambda(arg3Exp).Compile().DynamicInvoke(); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 2f8aed58..619c20c0 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -457,6 +457,11 @@ namespace FreeSql.Internal.CommonProvider { var body = exp?.Body; var nodeType = body?.NodeType; + if (nodeType == ExpressionType.Convert) + { + body = (body as UnaryExpression)?.Operand; + nodeType = body?.NodeType; + } switch (nodeType) { case ExpressionType.Equal: @@ -499,7 +504,7 @@ namespace FreeSql.Internal.CommonProvider if (body is BinaryExpression == false && nodeType != ExpressionType.Call) return this; var cols = new List(); - var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, exp, null, null); + var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, body, null, null); if (cols.Any() == false) return this; foreach (var col in cols) {