From b5c79204d8dc1ff5d1016a5bb7e4d4726bc15d28 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Thu, 11 Apr 2019 12:30:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20.ToList(a=20=3D>=20a.id)?= =?UTF-8?q?=20=E5=BD=93=20id=20=E6=98=AF=20guid=20=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E4=BC=9A=E5=87=BA=E7=8E=B0=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=A4=B1=E8=B4=A5=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs | 8 ++++++++ FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs | 8 ++++++++ .../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 8 ++++++++ .../PostgreSQL/PostgreSQLExpression/OtherTest.cs | 3 +++ .../SqlServer/Curd/SqlServerSelectTest.cs | 8 ++++++++ FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs | 8 ++++++++ FreeSql/Internal/CommonExpression.cs | 15 ++++++++------- FreeSql/Internal/UtilsExpressionTree.cs | 1 + 8 files changed, 52 insertions(+), 7 deletions(-) diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 82c6d485..ab23d0b9 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -230,6 +230,14 @@ namespace FreeSql.Tests.MySql { var t1111 = g.mysql.Select().ToList(a => new { a.Id, a.Title, a.Type }); var t2222 = g.mysql.Select().ToList(a => new { a.Id, a.Title, a.Type.Name }); + + g.mysql.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows(); + var testGuidId5 = g.mysql.Select().ToList(); + var testGuidId6 = g.mysql.Select().ToList(a => a.id); + } + class TestGuidIdToList { + public Guid id { get; set; } + public string title { get; set; } = Guid.NewGuid().ToString(); } [Fact] public void ToOne() { diff --git a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index cc4e430d..5791aaf2 100644 --- a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -139,6 +139,14 @@ namespace FreeSql.Tests.Oracle { var testDto2 = select.Limit(10).ToList(a => new TestDto()); var testDto3 = select.Limit(10).ToList(a => new TestDto { }); var testDto4 = select.Limit(10).ToList(a => new TestDto() { }); + + g.oracle.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows(); + var testGuidId5 = g.oracle.Select().ToList(); + var testGuidId6 = g.oracle.Select().ToList(a => a.id); + } + class TestGuidIdToList { + public Guid id { get; set; } + public string title { get; set; } = Guid.NewGuid().ToString(); } [Fact] public void ToOne() { diff --git a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index c94f0f9c..1d936edd 100644 --- a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -209,6 +209,14 @@ namespace FreeSql.Tests.PostgreSQL { var t1111 = g.pgsql.Select().ToList(a => new { a.Id, a.Title, a.Type }); var t2222 = g.pgsql.Select().ToList(a => new { a.Id, a.Title, a.Type.Name }); + + g.pgsql.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows(); + var testGuidId5 = g.pgsql.Select().ToList(); + var testGuidId6 = g.pgsql.Select().ToList(a => a.id); + } + class TestGuidIdToList { + public Guid id { get; set; } + public string title { get; set; } = Guid.NewGuid().ToString(); } [Fact] public void ToOne() { diff --git a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs index 54754ffd..c8c99168 100644 --- a/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -51,6 +51,9 @@ namespace FreeSql.Tests.PostgreSQLExpression { var sql112222 = select.Where(a => inarray.Contains(a.testFieldInt) == false).ToList(); var sql113333 = select.Where(a => !inarray.Contains(a.testFieldInt)).ToList(); + var sql1111112 = select.ToList(a => inarray); + var sql1111113 = select.ToList(a => a.testFieldIntArray); + var sql3 = select.Where(a => a.testFieldIntArray.Any()).ToList(); var sql4 = select.Where(a => a.testFieldIntArray.Any() == false).ToList(); diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 7cb330aa..62904188 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -141,6 +141,14 @@ namespace FreeSql.Tests.SqlServer { var testDto2 = select.Limit(10).ToList(a => new TestDto()); var testDto3 = select.Limit(10).ToList(a => new TestDto { }); var testDto4 = select.Limit(10).ToList(a => new TestDto() { }); + + _sqlserverFixture.SqlServer.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows(); + var testGuidId5 = _sqlserverFixture.SqlServer.Select().ToList(); + var testGuidId6 = _sqlserverFixture.SqlServer.Select().ToList(a => a.id); + } + class TestGuidIdToList { + public Guid id { get; set; } + public string title { get; set; } = Guid.NewGuid().ToString(); } [Fact] public void ToOne() { diff --git a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index c6ce7c0f..44548fbb 100644 --- a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -133,6 +133,14 @@ namespace FreeSql.Tests.Sqlite { var testDto2 = select.Limit(10).ToList(a => new TestDto()); var testDto3 = select.Limit(10).ToList(a => new TestDto { }); var testDto4 = select.Limit(10).ToList(a => new TestDto() { }); + + g.sqlite.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows(); + var testGuidId5 = g.sqlite.Select().ToList(); + var testGuidId6 = g.sqlite.Select().ToList(a => a.id); + } + class TestGuidIdToList { + public Guid id { get; set; } + public string title { get; set; } = Guid.NewGuid().ToString(); } [Fact] public void ToOne() { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 8b985ab0..e10c2f78 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -66,13 +66,15 @@ namespace FreeSql.Internal { for (var idx = 0; idx < map.Count; idx++) { var child = new ReadAnonymousTypeInfo { Property = tb.Properties.TryGetValue(map[idx].Column.CsName, out var tryprop) ? tryprop : tb.Type.GetProperty(map[idx].Column.CsName, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance), - CsName = map[idx].Column.CsName, DbField = $"{map[idx].Table.Alias}.{_common.QuoteSqlName(map[idx].Column.Attribute.Name)}" + CsName = map[idx].Column.CsName, DbField = $"{map[idx].Table.Alias}.{_common.QuoteSqlName(map[idx].Column.Attribute.Name)}", + CsType = map[idx].Column.CsType }; field.Append(", ").Append(_common.QuoteReadColumn(map[idx].Column.CsType, child.DbField)); if (index >= 0) field.Append(" as").Append(++index); parent.Childs.Add(child); } } else { + parent.CsType = exp.Type; parent.DbField = ExpressionLambdaToSql(exp, _tables, null, getSelectGroupingMapString, SelectTableInfoType.From, true, false, ExpressionStyle.Where); field.Append(", ").Append(parent.DbField); if (index >= 0) field.Append(" as").Append(++index); @@ -157,9 +159,9 @@ namespace FreeSql.Internal { if (parent.Childs.Any() == false) { if (notRead) { ++index; - return null; + return Utils.GetDataReaderValue(parent.CsType, null); } - return dr.GetValue(++index); + return Utils.GetDataReaderValue(parent.CsType, dr.GetValue(++index)); } switch (parent.ConsturctorType) { case ReadAnonymousTypeInfoConsturctorType.Arguments: @@ -167,7 +169,7 @@ namespace FreeSql.Internal { for (var a = 0; a < parent.Childs.Count; a++) { var objval = ReadAnonymous(parent.Childs[a], dr, ref index, notRead); if (notRead == false) - args[a] = Utils.GetDataReaderValue(parent.Childs[a].CsType, objval); + args[a] = objval; } return parent.Consturctor.Invoke(args); case ReadAnonymousTypeInfoConsturctorType.Properties: @@ -176,11 +178,10 @@ namespace FreeSql.Internal { for (var b = 0; b < parent.Childs.Count; b++) { var prop = parent.Childs[b].Property; var objval = ReadAnonymous(parent.Childs[b], dr, ref index, notRead); - var safeval = Utils.GetDataReaderValue(prop.PropertyType, objval); - if (isnull == false && safeval == null && parent.Table != null && parent.Table.ColumnsByCs.TryGetValue(parent.Childs[b].CsName, out var trycol) && trycol.Attribute.IsPrimary) + if (isnull == false && objval == null && parent.Table != null && parent.Table.ColumnsByCs.TryGetValue(parent.Childs[b].CsName, out var trycol) && trycol.Attribute.IsPrimary) isnull = true; if (isnull == false) - prop.SetValue(ret, safeval, null); + prop.SetValue(ret, objval, null); } return isnull ? null : ret; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 28ff4b40..f4d66d08 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1098,6 +1098,7 @@ namespace FreeSql.Internal { } public static object GetDataReaderValue(Type type, object value) { if (value == null || value == DBNull.Value) return null; + if (type == null) return value; var func = _dicGetDataReaderValue.GetOrAdd(type, k1 => new ConcurrentDictionary>()).GetOrAdd(value.GetType(), valueType => { var parmExp = Expression.Parameter(typeof(object), "value"); var exp = GetDataReaderValueBlockExpression(type, parmExp);