diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 1ab5bf1c..6b638cad 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -795,14 +795,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs similarity index 68% rename from FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs rename to FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs index 2b7f32c5..834d83b8 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs @@ -1,17 +1,18 @@ using FreeSql.DataAnnotations; using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; using System.Text; using Xunit; -namespace FreeSql.Tests.PostgreSQL +namespace FreeSql.Tests.PostgreSQL.PgArrayToMany { - public class PostgreSQLPgArrayToManyTest + public class LazyLoadingTest { [Table(Name = "pgarray_tomany_user_lazyloading")] - public class UserLazyLoading + public class User { [Column(IsPrimary = true)] public int UserId { get; set; } @@ -19,57 +20,96 @@ namespace FreeSql.Tests.PostgreSQL public string UserName { get; set; } [Navigate(nameof(RoleIds))] - public virtual List Roles { get; set; } + public virtual List Roles { get; set; } } [Table(Name = "pgarray_tomany_role_lazyloading")] - public class RoleLazyLoading + public class Role { [Column(IsPrimary = true)] public int RoleId { get; set; } public string RoleName { get; set; } - [Navigate(nameof(UserLazyLoading.RoleIds))] - public virtual List Users { get; set; } + [Navigate(nameof(User.RoleIds))] + public virtual List Users { get; set; } } [Fact] public void LazyLoading() { var fsql = g.pgsql; - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); var roles = new[] { - new RoleLazyLoading { RoleId = 1, RoleName = "role1" }, - new RoleLazyLoading { RoleId = 2, RoleName = "role2" }, - new RoleLazyLoading { RoleId = 3, RoleName = "role3" } + new Role { RoleId = 1, RoleName = "role1" }, + new Role { RoleId = 2, RoleName = "role2" }, + new Role { RoleId = 3, RoleName = "role3" } }; Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows()); var users = new[] { - new UserLazyLoading { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, - new UserLazyLoading { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, - new UserLazyLoading { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, - new UserLazyLoading { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, - new UserLazyLoading { UserId = 15, RoleIds = null, UserName = "user5" }, - new UserLazyLoading { UserId = 16, RoleIds = new int[0], UserName = "user6" }, + new User { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, + new User { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, + new User { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, + new User { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, + new User { UserId = 15, RoleIds = null, UserName = "user5" }, + new User { UserId = 16, RoleIds = new int[0], UserName = "user6" }, }; Assert.Equal(6, fsql.Insert(users).ExecuteAffrows()); - var users4 = fsql.Select().IncludeMany(a => a.Roles).ToList(a => new + var users5Select = fsql.Select().Where(a => a.Roles.Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_lazyloading"" b + WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + limit 1))", users5Select.ToSql()); + var users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + users5Select = fsql.Select().Where(a => a.Roles.AsSelect().Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_lazyloading"" b + WHERE (b.""rolename"" = 'role1') AND (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) + limit 1))", users5Select.ToSql()); + users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + + var roles5Select = fsql.Select().Where(a => a.Users.Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_lazyloading"" b + WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + limit 1))", roles5Select.ToSql()); + var roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + roles5Select = fsql.Select().Where(a => a.Users.AsSelect().Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_lazyloading"" b + WHERE (b.""username"" = 'user1') AND (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) + limit 1))", roles5Select.ToSql()); + roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + + + var users4 = fsql.Select().IncludeMany(a => a.Roles).ToList(a => new { user = a, roles = a.Roles }); - var roles4 = fsql.Select().IncludeMany(a => a.Users).ToList(a => new + var roles4 = fsql.Select().IncludeMany(a => a.Users).ToList(a => new { role = a, users = a.Users }); - var users3 = fsql.Select().IncludeMany(a => a.Roles).ToList(); + var users3 = fsql.Select().IncludeMany(a => a.Roles).ToList(); Assert.Equal(6, users3.Count); var users2 = users3; Assert.Equal(11, users2[0].UserId); @@ -122,7 +162,7 @@ namespace FreeSql.Tests.PostgreSQL Assert.Null(users3[4].Roles); Assert.Empty(users3[5].Roles); - var roles3 = fsql.Select().IncludeMany(a => a.Users).ToList(); + var roles3 = fsql.Select().IncludeMany(a => a.Users).ToList(); Assert.Equal(3, roles3.Count); roles2 = roles3; Assert.Equal(1, roles2[0].RoleId); @@ -171,8 +211,8 @@ namespace FreeSql.Tests.PostgreSQL Assert.Equal("user4", users2[2].UserName); Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); - var role = fsql.Select().Where(a => a.RoleId == 1).First(); - Assert.IsNotType(role); + var role = fsql.Select().Where(a => a.RoleId == 1).First(); + Assert.IsNotType(role); users2 = role.Users; Assert.Equal(4, users2.Count); @@ -221,8 +261,8 @@ namespace FreeSql.Tests.PostgreSQL Assert.Equal(1, roles2[2].RoleId); Assert.Equal("role1", roles2[2].RoleName); - var user = fsql.Select().Where(a => a.UserId == 11).First(); - Assert.IsNotType(user); + var user = fsql.Select().Where(a => a.UserId == 11).First(); + Assert.IsNotType(user); roles2 = user.Roles; Assert.Equal(2, roles2.Count); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs new file mode 100644 index 00000000..a697dc62 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs @@ -0,0 +1,221 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Xunit; + +namespace FreeSql.Tests.PostgreSQL.PgArrayToMany +{ + public class NormalTest + { + + [Table(Name = "pgarray_tomany_user_normal")] + public class User + { + [Column(IsPrimary = true)] + public int UserId { get; set; } + public int[] RoleIds { get; set; } + public string UserName { get; set; } + + [Navigate(nameof(RoleIds))] + public List Roles { get; set; } + } + + [Table(Name = "pgarray_tomany_role_normal")] + public class Role + { + [Column(IsPrimary = true)] + public int RoleId { get; set; } + public string RoleName { get; set; } + + [Navigate(nameof(User.RoleIds))] + public List Users { get; set; } + } + + [Fact] + public void Normal() + { + var fsql = g.pgsql; + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + + var roles = new[] + { + new Role { RoleId = 1, RoleName = "role1" }, + new Role { RoleId = 2, RoleName = "role2" }, + new Role { RoleId = 3, RoleName = "role3" } + }; + Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows()); + var users = new[] + { + new User { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, + new User { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, + new User { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, + new User { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, + new User { UserId = 15, RoleIds = null, UserName = "user5" }, + new User { UserId = 16, RoleIds = new int[0], UserName = "user6" }, + }; + Assert.Equal(6, fsql.Insert(users).ExecuteAffrows()); + + var users5Select = fsql.Select().Where(a => a.Roles.Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_normal"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_normal"" b + WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + limit 1))", users5Select.ToSql()); + var users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + users5Select = fsql.Select().Where(a => a.Roles.AsSelect().Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_normal"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_normal"" b + WHERE (b.""rolename"" = 'role1') AND (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) + limit 1))", users5Select.ToSql()); + users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + + var roles5Select = fsql.Select().Where(a => a.Users.Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_normal"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_normal"" b + WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + limit 1))", roles5Select.ToSql()); + var roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + roles5Select = fsql.Select().Where(a => a.Users.AsSelect().Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_normal"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_normal"" b + WHERE (b.""username"" = 'user1') AND (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) + limit 1))", roles5Select.ToSql()); + roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + + + var users4 = fsql.Select().IncludeMany(a => a.Roles).ToList(a => new + { + user = a, roles = a.Roles + }); + var roles4 = fsql.Select().IncludeMany(a => a.Users).ToList(a => new + { + role = a, + users = a.Users + }); + + + 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); + Assert.Equal("role2", roles2[1].RoleName); + Assert.Equal(3, roles2[2].RoleId); + Assert.Equal("role3", roles2[2].RoleName); + + 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); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(13, users2[2].UserId); + Assert.Equal("user3", users2[2].UserName); + Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); + Assert.Equal(14, users2[3].UserId); + Assert.Equal("user4", users2[3].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); + + users2 = roles2[1].Users; + Assert.Equal(3, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + users2 = roles2[2].Users; + Assert.Equal(3, users2.Count); + Assert.Equal(12, users2[0].UserId); + Assert.Equal("user2", users2[0].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[0].RoleIds)); + Assert.Equal(13, users2[1].UserId); + Assert.Equal("user3", users2[1].UserName); + Assert.Equal("1,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + var role = fsql.Select().Where(a => a.RoleId == 1).First(); + Assert.IsType(role); + + var user = fsql.Select().Where(a => a.UserId == 11).First(); + Assert.IsType(user); + } + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs new file mode 100644 index 00000000..29d9d271 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs @@ -0,0 +1,275 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Xunit; + +namespace FreeSql.Tests.PostgreSQL.PgArrayToMany +{ + public class ObservableCollectionLazyLoadingTest + { + + [Table(Name = "pgarray_tomany_user_observablecollection_lazyloading")] + public class User + { + [Column(IsPrimary = true)] + public int UserId { get; set; } + public int[] RoleIds { get; set; } + public string UserName { get; set; } + + [Navigate(nameof(RoleIds))] + public virtual List Roles { get; set; } + } + + [Table(Name = "pgarray_tomany_role_observablecollection_lazyloading")] + public class Role + { + [Column(IsPrimary = true)] + public int RoleId { get; set; } + public string RoleName { get; set; } + + [Navigate(nameof(User.RoleIds))] + public virtual List Users { get; set; } + } + + [Fact] + public void ObservableCollectionLazyLoading() + { + var fsql = g.pgsql; + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + + var roles = new[] + { + new Role { RoleId = 1, RoleName = "role1" }, + new Role { RoleId = 2, RoleName = "role2" }, + new Role { RoleId = 3, RoleName = "role3" } + }; + Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows()); + var users = new[] + { + new User { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, + new User { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, + new User { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, + new User { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, + new User { UserId = 15, RoleIds = null, UserName = "user5" }, + new User { UserId = 16, RoleIds = new int[0], UserName = "user6" }, + }; + Assert.Equal(6, fsql.Insert(users).ExecuteAffrows()); + + var users5Select = fsql.Select().Where(a => a.Roles.Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_observablecollection_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_observablecollection_lazyloading"" b + WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + limit 1))", users5Select.ToSql()); + var users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + users5Select = fsql.Select().Where(a => a.Roles.AsSelect().Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_observablecollection_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_observablecollection_lazyloading"" b + WHERE (b.""rolename"" = 'role1') AND (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) + limit 1))", users5Select.ToSql()); + users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + + var roles5Select = fsql.Select().Where(a => a.Users.Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_observablecollection_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_observablecollection_lazyloading"" b + WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + limit 1))", roles5Select.ToSql()); + var roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + roles5Select = fsql.Select().Where(a => a.Users.AsSelect().Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_observablecollection_lazyloading"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_observablecollection_lazyloading"" b + WHERE (b.""username"" = 'user1') AND (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) + limit 1))", roles5Select.ToSql()); + roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + + + var users4 = fsql.Select().IncludeMany(a => a.Roles).ToList(a => new + { + user = a, roles = a.Roles + }); + var roles4 = fsql.Select().IncludeMany(a => a.Users).ToList(a => new + { + role = a, + users = a.Users + }); + + + 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); + Assert.Equal("role2", roles2[1].RoleName); + Assert.Equal(3, roles2[2].RoleId); + Assert.Equal("role3", roles2[2].RoleName); + + 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); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(13, users2[2].UserId); + Assert.Equal("user3", users2[2].UserName); + Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); + Assert.Equal(14, users2[3].UserId); + Assert.Equal("user4", users2[3].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); + + users2 = roles2[1].Users; + Assert.Equal(3, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + users2 = roles2[2].Users; + Assert.Equal(3, users2.Count); + Assert.Equal(12, users2[0].UserId); + Assert.Equal("user2", users2[0].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[0].RoleIds)); + Assert.Equal(13, users2[1].UserId); + Assert.Equal("user3", users2[1].UserName); + Assert.Equal("1,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + var role = fsql.Select().Where(a => a.RoleId == 1).First(); + Assert.IsNotType(role); + + users2 = role.Users; + Assert.Equal(4, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(13, users2[2].UserId); + Assert.Equal("user3", users2[2].UserName); + Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); + Assert.Equal(14, users2[3].UserId); + Assert.Equal("user4", users2[3].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); + + roles2 = users2[0].Roles; + Assert.Equal(2, roles2.Count); + 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 = users2[1].Roles; + Assert.Equal(3, roles2.Count); + 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); + + roles2 = users2[2].Roles; + Assert.Equal(2, roles2.Count); + 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 = users2[3].Roles; + Assert.Equal(3, roles2.Count); + 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); + + var user = fsql.Select().Where(a => a.UserId == 11).First(); + Assert.IsNotType(user); + + roles2 = user.Roles; + Assert.Equal(2, roles2.Count); + Assert.Equal(1, roles2[0].RoleId); + Assert.Equal("role1", roles2[0].RoleName); + Assert.Equal(2, roles2[1].RoleId); + Assert.Equal("role2", roles2[1].RoleName); + } + } +} diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs new file mode 100644 index 00000000..671dadca --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs @@ -0,0 +1,223 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using System.Text; +using Xunit; + +namespace FreeSql.Tests.PostgreSQL.PgArrayToMany +{ + public class ObservableCollectionTest + { + + [Table(Name = "pgarray_tomany_user_observablecollection")] + public class User + { + [Column(IsPrimary = true)] + public int UserId { get; set; } + public int[] RoleIds { get; set; } + public string UserName { get; set; } + + [Navigate(nameof(RoleIds))] + public ObservableCollection Roles { get; set; } + } + + [Table(Name = "pgarray_tomany_role_observablecollection")] + public class Role + { + [Column(IsPrimary = true)] + public int RoleId { get; set; } + public string RoleName { get; set; } + + [Navigate(nameof(User.RoleIds))] + public ObservableCollection Users { get; set; } + } + + [Fact] + public void ObservableCollection() + { + var fsql = g.pgsql; + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + + var roles = new[] + { + new Role { RoleId = 1, RoleName = "role1" }, + new Role { RoleId = 2, RoleName = "role2" }, + new Role { RoleId = 3, RoleName = "role3" } + }; + Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows()); + var users = new[] + { + new User { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, + new User { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, + new User { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, + new User { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, + new User { UserId = 15, RoleIds = null, UserName = "user5" }, + new User { UserId = 16, RoleIds = new int[0], UserName = "user6" }, + }; + Assert.Equal(6, fsql.Insert(users).ExecuteAffrows()); + + var users5Select = fsql.Select().Where(a => a.Roles.Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_observablecollection"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_observablecollection"" b + WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + limit 1))", users5Select.ToSql()); + var users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + users5Select = fsql.Select().Where(a => a.Roles.AsSelect().Any(b => b.RoleName == "role1")); + Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" +FROM ""pgarray_tomany_user_observablecollection"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_role_observablecollection"" b + WHERE (b.""rolename"" = 'role1') AND (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) + limit 1))", users5Select.ToSql()); + users5 = users5Select.ToList(); + Assert.Equal(4, users5.Count); + + var roles5Select = fsql.Select().Where(a => a.Users.Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_observablecollection"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_observablecollection"" b + WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + limit 1))", roles5Select.ToSql()); + var roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + roles5Select = fsql.Select().Where(a => a.Users.AsSelect().Any(b => b.UserName == "user1")); + Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" +FROM ""pgarray_tomany_role_observablecollection"" a +WHERE (exists(SELECT 1 + FROM ""pgarray_tomany_user_observablecollection"" b + WHERE (b.""username"" = 'user1') AND (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) + limit 1))", roles5Select.ToSql()); + roles5 = roles5Select.ToList(); + Assert.Equal(2, roles5.Count); + + + var users4 = fsql.Select().IncludeMany(a => a.Roles).ToList(a => new + { + user = a, + roles = a.Roles + }); + var roles4 = fsql.Select().IncludeMany(a => a.Users).ToList(a => new + { + role = a, + users = a.Users + }); + + + 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.ToList(); + 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.ToList(); + 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); + + roles2 = users3[2].Roles.ToList(); + 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.ToList(); + 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.ToList(); + 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.ToList(); + Assert.Equal(4, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(13, users2[2].UserId); + Assert.Equal("user3", users2[2].UserName); + Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); + Assert.Equal(14, users2[3].UserId); + Assert.Equal("user4", users2[3].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); + + users2 = roles2[1].Users.ToList(); + Assert.Equal(3, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + users2 = roles2[2].Users.ToList(); + Assert.Equal(3, users2.Count); + Assert.Equal(12, users2[0].UserId); + Assert.Equal("user2", users2[0].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[0].RoleIds)); + Assert.Equal(13, users2[1].UserId); + Assert.Equal("user3", users2[1].UserName); + Assert.Equal("1,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + var role = fsql.Select().Where(a => a.RoleId == 1).First(); + Assert.IsType(role); + + var user = fsql.Select().Where(a => a.UserId == 11).First(); + Assert.IsType(user); + } + } +} diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 160a7397..434ec7a2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3303,6 +3303,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4326,6 +4497,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4401,6 +4578,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 30c34799..9b22e35d 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1212,9 +1212,19 @@ namespace FreeSql.Internal var amtReftbname = ExpressionLambdaToSql(Expression.MakeMemberAccess(asSelectParentExp, parm123Tb.Properties[parm123Tb.ColumnsByPosition[0].CsName]), tsc); amtReftbname = amtReftbname.Substring(0, amtReftbname.Length - _common.QuoteSqlName(parm123Tb.ColumnsByPosition[0].Attribute.Name).Length - 1); if (parm123Ref.RefColumns[0] == fsqltables[0].Table.Primarys[0]) - (fsql as Select0Provider)._where.Append(" AND (").Append($"{amtReftbname}.{_common.QuoteSqlName(parm123Ref.Columns[0].Attribute.Name)} @> {fsqltables[0].Alias}.{_common.QuoteSqlName(parm123Ref.RefColumns[0].Attribute.Name)}").Append(")"); - else if (parm123Ref.Columns[0] == fsqltables[0].Table.Primarys[0]) - (fsql as Select0Provider)._where.Append(" AND (").Append($"{amtReftbname}.{_common.QuoteSqlName(parm123Ref.RefColumns[0].Attribute.Name)} @> {fsqltables[0].Alias}.{_common.QuoteSqlName(parm123Ref.Columns[0].Attribute.Name)}").Append(")"); + { + var dbinfo = _common._orm.CodeFirst.GetDbInfo(parm123Ref.Columns[0].CsType); + (fsql as Select0Provider)._where.Append(" AND (").Append($"{amtReftbname}.{_common.QuoteSqlName(parm123Ref.Columns[0].Attribute.Name)} @> ARRAY[{fsqltables[0].Alias}.{_common.QuoteSqlName(parm123Ref.RefColumns[0].Attribute.Name)}]::{dbinfo?.dbtype}").Append(")"); + } + else if (parm123Ref.Columns[0] == parm123Tb.Primarys[0]) + { + var dbinfo = _common._orm.CodeFirst.GetDbInfo(parm123Ref.RefColumns[0].CsType); + (fsql as Select0Provider)._where.Append(" AND (").Append($"{fsqltables[0].Alias}.{_common.QuoteSqlName(parm123Ref.RefColumns[0].Attribute.Name)} @> ARRAY[{amtReftbname}.{_common.QuoteSqlName(parm123Ref.Columns[0].Attribute.Name)}]::{dbinfo?.dbtype}").Append(")"); + } + else + { + ; + } } else { @@ -2213,9 +2223,19 @@ namespace FreeSql.Internal var amtReftbname = e.FreeParse(Expression.MakeMemberAccess(memberExp.Expression, exp3Tb.Properties[exp3Tb.ColumnsByPosition[0].CsName])); amtReftbname = amtReftbname.Substring(0, amtReftbname.Length - commonExp._common.QuoteSqlName(exp3Tb.ColumnsByPosition[0].Attribute.Name).Length - 1); if (memberTbref.RefColumns[0] == select._tables[0].Table.Primarys[0]) - select.Where($"{amtReftbname}.{commonExp._common.QuoteSqlName(memberTbref.Columns[0].Attribute.Name)} @> {select._tables[0].Alias}.{commonExp._common.QuoteSqlName(memberTbref.RefColumns[0].Attribute.Name)}"); - else if (memberTbref.Columns[0] == select._tables[0].Table.Primarys[0]) - select.Where($"{amtReftbname}.{commonExp._common.QuoteSqlName(memberTbref.RefColumns[0].Attribute.Name)} @> {select._tables[0].Alias}.{commonExp._common.QuoteSqlName(memberTbref.Columns[0].Attribute.Name)}"); + { + var dbinfo = commonExp._common._orm.CodeFirst.GetDbInfo(memberTbref.Columns[0].CsType); + select.Where($"{amtReftbname}.{commonExp._common.QuoteSqlName(memberTbref.Columns[0].Attribute.Name)} @> ARRAY[{select._tables[0].Alias}.{commonExp._common.QuoteSqlName(memberTbref.RefColumns[0].Attribute.Name)}]::{dbinfo?.dbtype}"); + } + else if (memberTbref.Columns[0] == exp3Tb.Primarys[0]) + { + var dbinfo = commonExp._common._orm.CodeFirst.GetDbInfo(memberTbref.RefColumns[0].CsType); + select.Where($"{select._tables[0].Alias}.{commonExp._common.QuoteSqlName(memberTbref.RefColumns[0].Attribute.Name)} @> ARRAY[{amtReftbname}.{commonExp._common.QuoteSqlName(memberTbref.Columns[0].Attribute.Name)}]::{dbinfo?.dbtype}"); + } + else + { + ; + } break; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 35fff582..23250bb1 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1044,11 +1044,14 @@ namespace FreeSql.Internal isArrayToMany = trycol != null; if (isArrayToMany) { - cscodeExtLogic1 = $" if (this.{trycol.CsName} == null) return null; \r\nif (this.{trycol.CsName}.Any() == false) return new {(propTypeIsObservableCollection ? "ObservableCollection" : "List")}<{propElementType.DisplayCsharp()}>();\r\n"; - cscodeExtLogic2 = $" loc2 = this.{trycol.CsName}.Select(a => loc2.FirstOrDefault(b => b.{tbref.Primarys[0].CsName} == a)).ToList();"; - lmbdWhere.Append("this.").Append(trycol.CsName).Append(".Contains(a.").Append(tbref.Primarys[0].CsName); - if (trycol.CsType.GetElementType().IsNullableType() == false && tbref.Primarys[0].CsType.IsNullableType()) lmbdWhere.Append(".Value"); - lmbdWhere.Append(")"); + if (isLazy) + { + cscodeExtLogic1 = $" if (this.{trycol.CsName} == null) return null; \r\nif (this.{trycol.CsName}.Any() == false) return new {(propTypeIsObservableCollection ? "ObservableCollection" : "List")}<{propElementType.DisplayCsharp()}>();\r\n"; + cscodeExtLogic2 = $" loc2 = this.{trycol.CsName}.Select(a => loc2.FirstOrDefault(b => b.{tbref.Primarys[0].CsName} == a)).ToList();"; + lmbdWhere.Append("this.").Append(trycol.CsName).Append(".Contains(a.").Append(tbref.Primarys[0].CsName); + if (trycol.CsType.GetElementType().IsNullableType() == false && tbref.Primarys[0].CsType.IsNullableType()) lmbdWhere.Append(".Value"); + lmbdWhere.Append(")"); + } nvref.Columns.Add(trycol); nvref.RefColumns.Add(tbref.Primarys[0]); nvref.RefEntityType = tbref.Type; @@ -1091,13 +1094,16 @@ namespace FreeSql.Internal isArrayToMany = trycol != null; if (isArrayToMany) { - lmbdWhere.Append("a.").Append(trycol.CsName).Append(".Contains(this.").Append(trytb.Primarys[0].CsName); - if (trycol.CsType.GetElementType().IsNullableType() == false && trytb.Primarys[0].CsType.IsNullableType()) + if (isLazy) { - lmbdWhere.Append(".Value"); - cscodeExtLogic1 = $" if (this.{trytb.Primarys[0].CsName} == null) return null;\r\n"; + lmbdWhere.Append("a.").Append(trycol.CsName).Append(".Contains(this.").Append(trytb.Primarys[0].CsName); + if (trycol.CsType.GetElementType().IsNullableType() == false && trytb.Primarys[0].CsType.IsNullableType()) + { + lmbdWhere.Append(".Value"); + cscodeExtLogic1 = $" if (this.{trytb.Primarys[0].CsName} == null) return null;\r\n"; + } + lmbdWhere.Append(")"); } - lmbdWhere.Append(")"); nvref.Columns.Add(trytb.Primarys[0]); nvref.RefColumns.Add(trycol); nvref.RefEntityType = tbref.Type;