From 375f123365bd460dbbb45d8b7dae9281391c8410 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Mon, 6 Jun 2022 16:09:38 +0800
Subject: [PATCH] add PgArrayToMany IncludeMany test #1147
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 ++
.../PostgreSQLPgArrayToManyTest .cs | 115 +++++++++++++-----
FreeSql/Internal/UtilsExpressionTree.cs | 14 +--
3 files changed, 99 insertions(+), 39 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 6b638cad..1ab5bf1c 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -795,5 +795,14 @@
+
+
+ 批量注入 Repository,可以参考代码自行调整
+
+
+
+
+
+
diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs
index 4ea56957..8c16b41b 100644
--- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs
+++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs
@@ -13,7 +13,8 @@ namespace FreeSql.Tests.PostgreSQL
[Table(Name = "pgarray_tomany_user_lazyloading")]
public class UserLazyLoading
{
- public int Id { get; set; }
+ [Column(IsPrimary = true)]
+ public int UserId { get; set; }
public int[] RoleIds { get; set; }
public string UserName { get; set; }
@@ -24,7 +25,8 @@ namespace FreeSql.Tests.PostgreSQL
[Table(Name = "pgarray_tomany_role_lazyloading")]
public class RoleLazyLoading
{
- public int Id { get; set; }
+ [Column(IsPrimary = true)]
+ public int RoleId { get; set; }
public string RoleName { get; set; }
[Navigate(nameof(UserLazyLoading.RoleIds))]
@@ -40,80 +42,129 @@ namespace FreeSql.Tests.PostgreSQL
var roles = new[]
{
- new RoleLazyLoading { Id = 1, RoleName = "role1" },
- new RoleLazyLoading { Id = 2, RoleName = "role2" },
- new RoleLazyLoading { Id = 3, RoleName = "role3" }
+ new RoleLazyLoading { RoleId = 1, RoleName = "role1" },
+ new RoleLazyLoading { RoleId = 2, RoleName = "role2" },
+ new RoleLazyLoading { RoleId = 3, RoleName = "role3" }
};
Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows());
var users = new[]
{
- new UserLazyLoading { Id = 11, RoleIds = new [] { 1,2 }, UserName = "user1" },
- new UserLazyLoading { Id = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" },
- new UserLazyLoading { Id = 13, RoleIds = new [] { 1,3 }, UserName = "user3" },
- new UserLazyLoading { Id = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" },
- new UserLazyLoading { Id = 15, RoleIds = null, UserName = "user5" },
- new UserLazyLoading { Id = 16, RoleIds = new int[0], UserName = "user6" },
+ 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" },
};
Assert.Equal(6, fsql.Insert(users).ExecuteAffrows());
- var role = fsql.Select().Where(a => a.Id == 1).First();
- Assert.IsNotType(role);
+ var roles3 = fsql.Select().IncludeMany(a => a.Users).ToList();
+ Assert.Equal(3, roles3.Count);
+ var 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);
- var users2 = role.Users;
+ var users2 = roles2[0].Users;
Assert.Equal(4, users2.Count);
- Assert.Equal(11, users2[0].Id);
+ 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].Id);
+ 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].Id);
+ 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].Id);
+ Assert.Equal(14, users2[3].UserId);
Assert.Equal("user4", users2[3].UserName);
Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds));
- var roles2 = users2[0].Roles;
+ 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].Id);
+ Assert.Equal(1, roles2[0].RoleId);
Assert.Equal("role1", roles2[0].RoleName);
- Assert.Equal(2, roles2[1].Id);
+ 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].Id);
+ Assert.Equal(1, roles2[0].RoleId);
Assert.Equal("role1", roles2[0].RoleName);
- Assert.Equal(2, roles2[1].Id);
+ Assert.Equal(2, roles2[1].RoleId);
Assert.Equal("role2", roles2[1].RoleName);
- Assert.Equal(3, roles2[2].Id);
+ 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].Id);
+ Assert.Equal(1, roles2[0].RoleId);
Assert.Equal("role1", roles2[0].RoleName);
- Assert.Equal(3, roles2[1].Id);
+ 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].Id);
+ Assert.Equal(3, roles2[0].RoleId);
Assert.Equal("role3", roles2[0].RoleName);
- Assert.Equal(2, roles2[1].Id);
+ Assert.Equal(2, roles2[1].RoleId);
Assert.Equal("role2", roles2[1].RoleName);
- Assert.Equal(1, roles2[2].Id);
+ Assert.Equal(1, roles2[2].RoleId);
Assert.Equal("role1", roles2[2].RoleName);
- var user = fsql.Select().Where(a => a.Id == 11).First();
+ 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].Id);
+ Assert.Equal(1, roles2[0].RoleId);
Assert.Equal("role1", roles2[0].RoleName);
- Assert.Equal(2, roles2[1].Id);
+ Assert.Equal(2, roles2[1].RoleId);
Assert.Equal("role2", roles2[1].RoleName);
}
}
diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs
index 5262560d..35fff582 100644
--- a/FreeSql/Internal/UtilsExpressionTree.cs
+++ b/FreeSql/Internal/UtilsExpressionTree.cs
@@ -1028,13 +1028,13 @@ namespace FreeSql.Internal
if (pnvBind == null && trycol == null)
{
var findtbrefPkCsName = tbref.Primarys[0].CsName.TrimStart('_');
- if (findtbrefPkCsName.StartsWith(trytb.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtbrefPkCsName = findtbrefPkCsName.Substring(trytb.Type.Name.Length).TrimStart('_');
+ if (findtbrefPkCsName.StartsWith(tbref.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtbrefPkCsName = findtbrefPkCsName.Substring(trytb.Type.Name.Length).TrimStart('_');
var findtrytb = pnv.Name;
if (findtrytb.EndsWith($"{tbref.CsName}s", StringComparison.CurrentCultureIgnoreCase)) findtrytb = findtrytb.Substring(0, findtrytb.Length - tbref.CsName.Length - 1);
findtrytb += tbref.CsName;
if (
- tbref.ColumnsByCs.TryGetValue($"{findtrytb}{findtbrefPkCsName}", out trycol) == false && //骆峰命名
- tbref.ColumnsByCs.TryGetValue($"{findtrytb}_{findtbrefPkCsName}", out trycol) == false //下划线命名
+ trytb.ColumnsByCs.TryGetValue($"{findtrytb}{findtbrefPkCsName}s", out trycol) == false && //骆峰命名
+ trytb.ColumnsByCs.TryGetValue($"{findtrytb}_{findtbrefPkCsName}s", out trycol) == false //下划线命名
)
{
}
@@ -1077,11 +1077,11 @@ namespace FreeSql.Internal
var findtrytbPkCsName = trytb.Primarys[0].CsName.TrimStart('_');
if (findtrytbPkCsName.StartsWith(trytb.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtrytbPkCsName = findtrytbPkCsName.Substring(trytb.Type.Name.Length).TrimStart('_');
var findtrytb = pnv.Name;
- if (findtrytb.EndsWith($"{tbref.CsName}s", StringComparison.CurrentCultureIgnoreCase)) findtrytb = findtrytb.Substring(0, findtrytb.Length - tbref.CsName.Length - 1);
+ if (findtrytb.EndsWith($"{trytb.CsName}s", StringComparison.CurrentCultureIgnoreCase)) findtrytb = findtrytb.Substring(0, findtrytb.Length - trytb.CsName.Length - 1);
findtrytb += trytb.CsName;
if (
- tbref.ColumnsByCs.TryGetValue($"{findtrytb}{findtrytbPkCsName}", out trycol) == false && //骆峰命名
- tbref.ColumnsByCs.TryGetValue($"{findtrytb}_{findtrytbPkCsName}", out trycol) == false //下划线命名
+ tbref.ColumnsByCs.TryGetValue($"{findtrytb}{findtrytbPkCsName}s", out trycol) == false && //骆峰命名
+ tbref.ColumnsByCs.TryGetValue($"{findtrytb}_{findtrytbPkCsName}s", out trycol) == false //下划线命名
)
{
}
@@ -1098,7 +1098,7 @@ namespace FreeSql.Internal
cscodeExtLogic1 = $" if (this.{trytb.Primarys[0].CsName} == null) return null;\r\n";
}
lmbdWhere.Append(")");
- nvref.Columns.Add(tbref.Primarys[0]);
+ nvref.Columns.Add(trytb.Primarys[0]);
nvref.RefColumns.Add(trycol);
nvref.RefEntityType = tbref.Type;
nvref.RefType = TableRefType.PgArrayToMany;