From 5891493402ee033cbc11c57fcdf39031588980bb Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 21 Jun 2019 11:11:08 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=20.HasValue=20=E5=92=8C=20!.HasValue=20=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=94=AF=E6=8C=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/UnitTest1.cs | 22 +++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 32 +++++++++++++++++----------- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index 65f1f96b..0ec89789 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -269,6 +269,28 @@ namespace FreeSql.Tests { [Fact] public void Test1() { + var dcksdkdsk = g.sqlite.Select().Where(a => a.testaddtime2.HasValue).ToSql(); + var dcksdkdsk2 = g.sqlite.Select().Where(a => !a.testaddtime2.HasValue).ToSql(); + + var testgrpsql = g.sqlite.Select() + .From((a, b) => a.InnerJoin(aa => aa.TemplatesId + == b.Id2)) + .GroupBy((a, b) => b.Title) + .ToSql(a => new { + a.Key, + sss = a.Sum(a.Value.Item1.Id) + }); + + var testgrpsql2 = g.sqlite.Select() + .From((a, b) => a.InnerJoin(aa => aa.TemplatesId + == b.Id2)) + .GroupBy((a, b) => b.Title) + .ToList(a => new { + a.Key, + sss = a.Sum(a.Value.Item1.Id) + }); + + var tbid = g.sqlite.Select().First().Id; var tbidsql = g.sqlite.Update().Where(a => a.Id == tbid) .Set(a => new TaskBuild { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 95365fa7..74f2f1b3 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -278,7 +278,7 @@ namespace FreeSql.Internal { }; public string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table }); - if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) + if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool) && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) return $"{sql} = {formatSql(true, null)}"; switch (sql) { case "1": @@ -291,7 +291,7 @@ namespace FreeSql.Internal { public string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); - if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) + if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool) && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) return $"{sql} = {formatSql(true, null)}"; switch (sql) { case "1": @@ -303,26 +303,26 @@ namespace FreeSql.Internal { } public void ExpressionJoinLambda(List _tables, SelectTableInfoType tbtype, Expression exp, Func getSelectGroupingMapString) { var tbidx = _tables.Count; - var filter = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); - if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) - filter = $"{filter} = {formatSql(true, null)}"; - switch (filter) { + var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); + if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool) && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) + sql = $"{sql} = {formatSql(true, null)}"; + switch (sql) { case "1": - case "'t'": filter = "1=1"; break; + case "'t'": sql = "1=1"; break; case "0": - case "'f'": filter = "1=2"; break; + case "'f'": sql = "1=2"; break; default: break; } if (_tables.Count > tbidx) { _tables[tbidx].Type = tbtype; - _tables[tbidx].On = filter; + _tables[tbidx].On = sql; for (var a = tbidx + 1; a < _tables.Count; a++) _tables[a].Type = SelectTableInfoType.From; } else { var find = _tables.Where((a, c) => c > 0 && (a.Type == tbtype || a.Type == SelectTableInfoType.From) && string.IsNullOrEmpty(a.On)).LastOrDefault(); if (find != null) { find.Type = tbtype; - find.On = filter; + find.On = sql; } } } @@ -409,7 +409,14 @@ namespace FreeSql.Internal { switch (exp.NodeType) { case ExpressionType.Not: var notExp = (exp as UnaryExpression)?.Operand; - if (notExp.NodeType == ExpressionType.MemberAccess) return $"{ExpressionLambdaToSql(notExp, tsc)} = {formatSql(false, null)}"; + if (notExp.NodeType == ExpressionType.MemberAccess) { + var notBody = ExpressionLambdaToSql(notExp, tsc); + if (notBody.Contains(" IS NULL")) return notBody.Replace(" IS NULL", " IS NOT NULL"); + if (notBody.Contains(" IS NOT NULL")) return notBody.Replace(" IS NOT NULL", " IS NULL"); + if (notBody.Contains("=")) return notBody.Replace("=", "!="); + if (notBody.Contains("!=")) return notBody.Replace("!=", "="); + return $"{notBody} = {formatSql(false, null)}"; + } return $"not({ExpressionLambdaToSql(notExp, tsc)})"; case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc); case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, tsc); @@ -665,7 +672,8 @@ namespace FreeSql.Internal { case ExpressionType.MemberAccess: var exp4 = exp as MemberExpression; if (exp4 != null) { - if (exp4.Expression != null && exp4.Expression.Type.IsArray == false && exp4.Expression.Type.IsNullableType()) return ExpressionLambdaToSql(exp4.Expression, tsc); + if (exp4.Expression != null && exp4.Expression.Type.IsArray == false && exp4.Expression.Type.IsNullableType()) + return exp4.Member.Name == "HasValue" ? $"{ExpressionLambdaToSql(exp4.Expression, tsc)} IS NOT NULL" : ExpressionLambdaToSql(exp4.Expression, tsc); var extRet = ""; var memberType = exp4.Expression?.Type ?? exp4.Type; switch (memberType.FullName) {