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;