mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
add PgArrayToMany ObservableCollection test #1145
This commit is contained in:
parent
e092823501
commit
e900f8383a
@ -795,14 +795,5 @@
|
|||||||
<param name="that"></param>
|
<param name="that"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
|
|
||||||
<summary>
|
|
||||||
批量注入 Repository,可以参考代码自行调整
|
|
||||||
</summary>
|
|
||||||
<param name="services"></param>
|
|
||||||
<param name="globalDataFilter"></param>
|
|
||||||
<param name="assemblies"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
using FreeSql.DataAnnotations;
|
using FreeSql.DataAnnotations;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace FreeSql.Tests.PostgreSQL
|
namespace FreeSql.Tests.PostgreSQL.PgArrayToMany
|
||||||
{
|
{
|
||||||
public class PostgreSQLPgArrayToManyTest
|
public class LazyLoadingTest
|
||||||
{
|
{
|
||||||
|
|
||||||
[Table(Name = "pgarray_tomany_user_lazyloading")]
|
[Table(Name = "pgarray_tomany_user_lazyloading")]
|
||||||
public class UserLazyLoading
|
public class User
|
||||||
{
|
{
|
||||||
[Column(IsPrimary = true)]
|
[Column(IsPrimary = true)]
|
||||||
public int UserId { get; set; }
|
public int UserId { get; set; }
|
||||||
@ -19,57 +20,96 @@ namespace FreeSql.Tests.PostgreSQL
|
|||||||
public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
|
|
||||||
[Navigate(nameof(RoleIds))]
|
[Navigate(nameof(RoleIds))]
|
||||||
public virtual List<RoleLazyLoading> Roles { get; set; }
|
public virtual List<Role> Roles { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Table(Name = "pgarray_tomany_role_lazyloading")]
|
[Table(Name = "pgarray_tomany_role_lazyloading")]
|
||||||
public class RoleLazyLoading
|
public class Role
|
||||||
{
|
{
|
||||||
[Column(IsPrimary = true)]
|
[Column(IsPrimary = true)]
|
||||||
public int RoleId { get; set; }
|
public int RoleId { get; set; }
|
||||||
public string RoleName { get; set; }
|
public string RoleName { get; set; }
|
||||||
|
|
||||||
[Navigate(nameof(UserLazyLoading.RoleIds))]
|
[Navigate(nameof(User.RoleIds))]
|
||||||
public virtual List<UserLazyLoading> Users { get; set; }
|
public virtual List<User> Users { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void LazyLoading()
|
public void LazyLoading()
|
||||||
{
|
{
|
||||||
var fsql = g.pgsql;
|
var fsql = g.pgsql;
|
||||||
fsql.Delete<UserLazyLoading>().Where("1=1").ExecuteAffrows();
|
fsql.Delete<User>().Where("1=1").ExecuteAffrows();
|
||||||
fsql.Delete<RoleLazyLoading>().Where("1=1").ExecuteAffrows();
|
fsql.Delete<Role>().Where("1=1").ExecuteAffrows();
|
||||||
|
|
||||||
var roles = new[]
|
var roles = new[]
|
||||||
{
|
{
|
||||||
new RoleLazyLoading { RoleId = 1, RoleName = "role1" },
|
new Role { RoleId = 1, RoleName = "role1" },
|
||||||
new RoleLazyLoading { RoleId = 2, RoleName = "role2" },
|
new Role { RoleId = 2, RoleName = "role2" },
|
||||||
new RoleLazyLoading { RoleId = 3, RoleName = "role3" }
|
new Role { RoleId = 3, RoleName = "role3" }
|
||||||
};
|
};
|
||||||
Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows());
|
Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows());
|
||||||
var users = new[]
|
var users = new[]
|
||||||
{
|
{
|
||||||
new UserLazyLoading { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" },
|
new User { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" },
|
||||||
new UserLazyLoading { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" },
|
new User { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" },
|
||||||
new UserLazyLoading { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" },
|
new User { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" },
|
||||||
new UserLazyLoading { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" },
|
new User { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" },
|
||||||
new UserLazyLoading { UserId = 15, RoleIds = null, UserName = "user5" },
|
new User { UserId = 15, RoleIds = null, UserName = "user5" },
|
||||||
new UserLazyLoading { UserId = 16, RoleIds = new int[0], UserName = "user6" },
|
new User { UserId = 16, RoleIds = new int[0], UserName = "user6" },
|
||||||
};
|
};
|
||||||
Assert.Equal(6, fsql.Insert(users).ExecuteAffrows());
|
Assert.Equal(6, fsql.Insert(users).ExecuteAffrows());
|
||||||
|
|
||||||
var users4 = fsql.Select<UserLazyLoading>().IncludeMany(a => a.Roles).ToList(a => new
|
var users5Select = fsql.Select<User>().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<User>().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<Role>().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<Role>().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<User>().IncludeMany(a => a.Roles).ToList(a => new
|
||||||
{
|
{
|
||||||
user = a, roles = a.Roles
|
user = a, roles = a.Roles
|
||||||
});
|
});
|
||||||
var roles4 = fsql.Select<RoleLazyLoading>().IncludeMany(a => a.Users).ToList(a => new
|
var roles4 = fsql.Select<Role>().IncludeMany(a => a.Users).ToList(a => new
|
||||||
{
|
{
|
||||||
role = a,
|
role = a,
|
||||||
users = a.Users
|
users = a.Users
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
var users3 = fsql.Select<UserLazyLoading>().IncludeMany(a => a.Roles).ToList();
|
var users3 = fsql.Select<User>().IncludeMany(a => a.Roles).ToList();
|
||||||
Assert.Equal(6, users3.Count);
|
Assert.Equal(6, users3.Count);
|
||||||
var users2 = users3;
|
var users2 = users3;
|
||||||
Assert.Equal(11, users2[0].UserId);
|
Assert.Equal(11, users2[0].UserId);
|
||||||
@ -122,7 +162,7 @@ namespace FreeSql.Tests.PostgreSQL
|
|||||||
Assert.Null(users3[4].Roles);
|
Assert.Null(users3[4].Roles);
|
||||||
Assert.Empty(users3[5].Roles);
|
Assert.Empty(users3[5].Roles);
|
||||||
|
|
||||||
var roles3 = fsql.Select<RoleLazyLoading>().IncludeMany(a => a.Users).ToList();
|
var roles3 = fsql.Select<Role>().IncludeMany(a => a.Users).ToList();
|
||||||
Assert.Equal(3, roles3.Count);
|
Assert.Equal(3, roles3.Count);
|
||||||
roles2 = roles3;
|
roles2 = roles3;
|
||||||
Assert.Equal(1, roles2[0].RoleId);
|
Assert.Equal(1, roles2[0].RoleId);
|
||||||
@ -171,8 +211,8 @@ namespace FreeSql.Tests.PostgreSQL
|
|||||||
Assert.Equal("user4", users2[2].UserName);
|
Assert.Equal("user4", users2[2].UserName);
|
||||||
Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds));
|
Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds));
|
||||||
|
|
||||||
var role = fsql.Select<RoleLazyLoading>().Where(a => a.RoleId == 1).First();
|
var role = fsql.Select<Role>().Where(a => a.RoleId == 1).First();
|
||||||
Assert.IsNotType<RoleLazyLoading>(role);
|
Assert.IsNotType<Role>(role);
|
||||||
|
|
||||||
users2 = role.Users;
|
users2 = role.Users;
|
||||||
Assert.Equal(4, users2.Count);
|
Assert.Equal(4, users2.Count);
|
||||||
@ -221,8 +261,8 @@ namespace FreeSql.Tests.PostgreSQL
|
|||||||
Assert.Equal(1, roles2[2].RoleId);
|
Assert.Equal(1, roles2[2].RoleId);
|
||||||
Assert.Equal("role1", roles2[2].RoleName);
|
Assert.Equal("role1", roles2[2].RoleName);
|
||||||
|
|
||||||
var user = fsql.Select<UserLazyLoading>().Where(a => a.UserId == 11).First();
|
var user = fsql.Select<User>().Where(a => a.UserId == 11).First();
|
||||||
Assert.IsNotType<UserLazyLoading>(user);
|
Assert.IsNotType<User>(user);
|
||||||
|
|
||||||
roles2 = user.Roles;
|
roles2 = user.Roles;
|
||||||
Assert.Equal(2, roles2.Count);
|
Assert.Equal(2, roles2.Count);
|
@ -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<Role> 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<User> Users { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Normal()
|
||||||
|
{
|
||||||
|
var fsql = g.pgsql;
|
||||||
|
fsql.Delete<User>().Where("1=1").ExecuteAffrows();
|
||||||
|
fsql.Delete<Role>().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<User>().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<User>().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<Role>().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<Role>().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<User>().IncludeMany(a => a.Roles).ToList(a => new
|
||||||
|
{
|
||||||
|
user = a, roles = a.Roles
|
||||||
|
});
|
||||||
|
var roles4 = fsql.Select<Role>().IncludeMany(a => a.Users).ToList(a => new
|
||||||
|
{
|
||||||
|
role = a,
|
||||||
|
users = a.Users
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var users3 = fsql.Select<User>().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<Role>().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<Role>().Where(a => a.RoleId == 1).First();
|
||||||
|
Assert.IsType<Role>(role);
|
||||||
|
|
||||||
|
var user = fsql.Select<User>().Where(a => a.UserId == 11).First();
|
||||||
|
Assert.IsType<User>(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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<Role> 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<User> Users { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ObservableCollectionLazyLoading()
|
||||||
|
{
|
||||||
|
var fsql = g.pgsql;
|
||||||
|
fsql.Delete<User>().Where("1=1").ExecuteAffrows();
|
||||||
|
fsql.Delete<Role>().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<User>().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<User>().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<Role>().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<Role>().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<User>().IncludeMany(a => a.Roles).ToList(a => new
|
||||||
|
{
|
||||||
|
user = a, roles = a.Roles
|
||||||
|
});
|
||||||
|
var roles4 = fsql.Select<Role>().IncludeMany(a => a.Users).ToList(a => new
|
||||||
|
{
|
||||||
|
role = a,
|
||||||
|
users = a.Users
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var users3 = fsql.Select<User>().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<Role>().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<Role>().Where(a => a.RoleId == 1).First();
|
||||||
|
Assert.IsNotType<Role>(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<User>().Where(a => a.UserId == 11).First();
|
||||||
|
Assert.IsNotType<User>(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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<Role> 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<User> Users { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ObservableCollection()
|
||||||
|
{
|
||||||
|
var fsql = g.pgsql;
|
||||||
|
fsql.Delete<User>().Where("1=1").ExecuteAffrows();
|
||||||
|
fsql.Delete<Role>().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<User>().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<User>().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<Role>().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<Role>().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<User>().IncludeMany(a => a.Roles).ToList(a => new
|
||||||
|
{
|
||||||
|
user = a,
|
||||||
|
roles = a.Roles
|
||||||
|
});
|
||||||
|
var roles4 = fsql.Select<Role>().IncludeMany(a => a.Users).ToList(a => new
|
||||||
|
{
|
||||||
|
role = a,
|
||||||
|
users = a.Users
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var users3 = fsql.Select<User>().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<Role>().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<Role>().Where(a => a.RoleId == 1).First();
|
||||||
|
Assert.IsType<Role>(role);
|
||||||
|
|
||||||
|
var user = fsql.Select<User>().Where(a => a.UserId == 11).First();
|
||||||
|
Assert.IsType<User>(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3303,6 +3303,177 @@
|
|||||||
<param name="parms"></param>
|
<param name="parms"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteConnectTestAsync(System.Int32,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
测试数据库是否连接正确,本方法执行如下命令:<para></para>
|
||||||
|
MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1<para></para>
|
||||||
|
Oracle: SELECT 1 FROM dual<para></para>
|
||||||
|
</summary>
|
||||||
|
<param name="commandTimeout">命令超时设置(秒)</param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns>true: 成功, false: 失败</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||||
|
</summary>
|
||||||
|
<param name="readerHander"></param>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="readerHander"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T"></typeparam>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T"></typeparam>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<typeparam name="T2"></typeparam>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object,System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<typeparam name="T2"></typeparam>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="E:FreeSql.IAop.ParseExpression">
|
<member name="E:FreeSql.IAop.ParseExpression">
|
||||||
<summary>
|
<summary>
|
||||||
可自定义解析表达式
|
可自定义解析表达式
|
||||||
@ -4326,6 +4497,12 @@
|
|||||||
<param name="timeout">超时</param>
|
<param name="timeout">超时</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.GetAsync">
|
||||||
|
<summary>
|
||||||
|
获取资源
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
|
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
使用完毕后,归还资源
|
使用完毕后,归还资源
|
||||||
@ -4401,6 +4578,12 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<param name="obj">资源对象</param>
|
<param name="obj">资源对象</param>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGetAsync(FreeSql.Internal.ObjectPool.Object{`0})">
|
||||||
|
<summary>
|
||||||
|
从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
|
||||||
|
</summary>
|
||||||
|
<param name="obj">资源对象</param>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
|
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
|
||||||
<summary>
|
<summary>
|
||||||
归还对象给对象池的时候触发
|
归还对象给对象池的时候触发
|
||||||
|
@ -1212,9 +1212,19 @@ namespace FreeSql.Internal
|
|||||||
var amtReftbname = ExpressionLambdaToSql(Expression.MakeMemberAccess(asSelectParentExp, parm123Tb.Properties[parm123Tb.ColumnsByPosition[0].CsName]), tsc);
|
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);
|
amtReftbname = amtReftbname.Substring(0, amtReftbname.Length - _common.QuoteSqlName(parm123Tb.ColumnsByPosition[0].Attribute.Name).Length - 1);
|
||||||
if (parm123Ref.RefColumns[0] == fsqltables[0].Table.Primarys[0])
|
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])
|
var dbinfo = _common._orm.CodeFirst.GetDbInfo(parm123Ref.Columns[0].CsType);
|
||||||
(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(")");
|
(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
|
else
|
||||||
{
|
{
|
||||||
@ -2213,9 +2223,19 @@ namespace FreeSql.Internal
|
|||||||
var amtReftbname = e.FreeParse(Expression.MakeMemberAccess(memberExp.Expression, exp3Tb.Properties[exp3Tb.ColumnsByPosition[0].CsName]));
|
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);
|
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])
|
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])
|
var dbinfo = commonExp._common._orm.CodeFirst.GetDbInfo(memberTbref.Columns[0].CsType);
|
||||||
select.Where($"{amtReftbname}.{commonExp._common.QuoteSqlName(memberTbref.RefColumns[0].Attribute.Name)} @> {select._tables[0].Alias}.{commonExp._common.QuoteSqlName(memberTbref.Columns[0].Attribute.Name)}");
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,11 +1044,14 @@ namespace FreeSql.Internal
|
|||||||
isArrayToMany = trycol != null;
|
isArrayToMany = trycol != null;
|
||||||
if (isArrayToMany)
|
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";
|
if (isLazy)
|
||||||
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);
|
cscodeExtLogic1 = $" if (this.{trycol.CsName} == null) return null; \r\nif (this.{trycol.CsName}.Any() == false) return new {(propTypeIsObservableCollection ? "ObservableCollection" : "List")}<{propElementType.DisplayCsharp()}>();\r\n";
|
||||||
if (trycol.CsType.GetElementType().IsNullableType() == false && tbref.Primarys[0].CsType.IsNullableType()) lmbdWhere.Append(".Value");
|
cscodeExtLogic2 = $" loc2 = this.{trycol.CsName}.Select(a => loc2.FirstOrDefault(b => b.{tbref.Primarys[0].CsName} == a)).ToList();";
|
||||||
lmbdWhere.Append(")");
|
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.Columns.Add(trycol);
|
||||||
nvref.RefColumns.Add(tbref.Primarys[0]);
|
nvref.RefColumns.Add(tbref.Primarys[0]);
|
||||||
nvref.RefEntityType = tbref.Type;
|
nvref.RefEntityType = tbref.Type;
|
||||||
@ -1091,13 +1094,16 @@ namespace FreeSql.Internal
|
|||||||
isArrayToMany = trycol != null;
|
isArrayToMany = trycol != null;
|
||||||
if (isArrayToMany)
|
if (isArrayToMany)
|
||||||
{
|
{
|
||||||
lmbdWhere.Append("a.").Append(trycol.CsName).Append(".Contains(this.").Append(trytb.Primarys[0].CsName);
|
if (isLazy)
|
||||||
if (trycol.CsType.GetElementType().IsNullableType() == false && trytb.Primarys[0].CsType.IsNullableType())
|
|
||||||
{
|
{
|
||||||
lmbdWhere.Append(".Value");
|
lmbdWhere.Append("a.").Append(trycol.CsName).Append(".Contains(this.").Append(trytb.Primarys[0].CsName);
|
||||||
cscodeExtLogic1 = $" if (this.{trytb.Primarys[0].CsName} == null) return null;\r\n";
|
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.Columns.Add(trytb.Primarys[0]);
|
||||||
nvref.RefColumns.Add(trycol);
|
nvref.RefColumns.Add(trycol);
|
||||||
nvref.RefEntityType = tbref.Type;
|
nvref.RefEntityType = tbref.Type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user