diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs index 8c16b41b..fac2fbfb 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs @@ -58,9 +58,35 @@ namespace FreeSql.Tests.PostgreSQL }; Assert.Equal(6, fsql.Insert(users).ExecuteAffrows()); - var roles3 = fsql.Select().IncludeMany(a => a.Users).ToList(); - Assert.Equal(3, roles3.Count); - var roles2 = roles3; + var users3 = fsql.Select().IncludeMany(a => a.Roles).ToList(); + Assert.Equal(6, users3.Count); + var users2 = users3; + Assert.Equal(11, users2[0].UserId); + Assert.Equal(12, users2[1].UserId); + Assert.Equal(13, users2[2].UserId); + Assert.Equal(14, users2[3].UserId); + Assert.Equal(15, users2[4].UserId); + Assert.Equal(16, users2[5].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("user3", users2[2].UserName); + Assert.Equal("user4", users2[3].UserName); + Assert.Equal("user5", users2[4].UserName); + Assert.Equal("user6", users2[5].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); + Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); + Assert.Null(users2[4].RoleIds); + Assert.Empty(users2[5].RoleIds); + + var roles2 = users3[0].Roles; + Assert.Equal(1, roles2[0].RoleId); + Assert.Equal("role1", roles2[0].RoleName); + Assert.Equal(2, roles2[1].RoleId); + Assert.Equal("role2", roles2[1].RoleName); + + roles2 = users3[1].Roles; Assert.Equal(1, roles2[0].RoleId); Assert.Equal("role1", roles2[0].RoleName); Assert.Equal(2, roles2[1].RoleId); @@ -68,7 +94,34 @@ namespace FreeSql.Tests.PostgreSQL Assert.Equal(3, roles2[2].RoleId); Assert.Equal("role3", roles2[2].RoleName); - var users2 = roles2[0].Users; + roles2 = users3[2].Roles; + Assert.Equal(1, roles2[0].RoleId); + Assert.Equal("role1", roles2[0].RoleName); + Assert.Equal(3, roles2[1].RoleId); + Assert.Equal("role3", roles2[1].RoleName); + + roles2 = users3[3].Roles; + Assert.Equal(3, roles2[0].RoleId); + Assert.Equal("role3", roles2[0].RoleName); + Assert.Equal(2, roles2[1].RoleId); + Assert.Equal("role2", roles2[1].RoleName); + Assert.Equal(1, roles2[2].RoleId); + Assert.Equal("role1", roles2[2].RoleName); + + Assert.Null(users3[4].Roles); + Assert.Empty(users3[5].Roles); + + var roles3 = fsql.Select().IncludeMany(a => a.Users).ToList(); + Assert.Equal(3, roles3.Count); + roles2 = roles3; + Assert.Equal(1, roles2[0].RoleId); + Assert.Equal("role1", roles2[0].RoleName); + Assert.Equal(2, roles2[1].RoleId); + Assert.Equal("role2", roles2[1].RoleName); + Assert.Equal(3, roles2[2].RoleId); + Assert.Equal("role3", roles2[2].RoleName); + + users2 = roles2[0].Users; Assert.Equal(4, users2.Count); Assert.Equal(11, users2[0].UserId); Assert.Equal("user1", users2[0].UserName); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 838e01eb..348e21eb 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -1184,11 +1184,12 @@ namespace FreeSql.Internal.CommonProvider var listKeys = list.Select(a => { var arrVal = getListValue(a, tbref.Columns[0].CsName, 0) as Array; + if (arrVal == null) return null; var arrObjVal = new object[arrVal.Length]; arrVal.CopyTo(arrObjVal, 0); return arrObjVal; - }).Where(a => a != null).ToArray(); - var arrExp = Expression.NewArrayInit(tbref.RefColumns[0].CsType, listKeys.SelectMany(a => a).Distinct() + }).ToArray(); + var arrExp = Expression.NewArrayInit(tbref.RefColumns[0].CsType, listKeys.Where(a => a != null).SelectMany(a => a).Distinct() .Select(a => Expression.Constant(Utils.GetDataReaderValue(tbref.RefColumns[0].CsType, a), tbref.RefColumns[0].CsType)).ToArray()); var otmExpParm1 = Expression.Parameter(typeof(TNavigate), "a"); var containsMethod = _dicTypeMethod.GetOrAdd(tbref.RefColumns[0].CsType, et => new ConcurrentDictionary()).GetOrAdd("Contains", mn => @@ -1235,6 +1236,7 @@ namespace FreeSql.Internal.CommonProvider { var item = list[y]; var dicListKeys = listKeys[y]; + if (dicListKeys == null) continue; var navs = new List(); foreach (var dlk in dicListKeys) {