SqlSugar/Src/Asp.NetCore2/SqlSeverTest/UserTestCases/UnitTest/UnitOneToMany123131.cs

188 lines
5.9 KiB
C#
Raw Normal View History

2025-05-22 19:12:53 +08:00
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OrmTest
{
public class UnitOneToMany123131
{
public static void Init()
{
var db = NewUnitTest.Db;
// db.DbMaintenance.DropTable< UnitNavLv1, UnitNavLv2, UnitNavLv3_1>();
try
{
db.CodeFirst.InitTables<Person, UnitNavLv1, UnitNavLv2, UnitNavLv3_1, UnitNavLv3_2>();
}
catch (Exception)
{
throw;
}
db.DbMaintenance.TruncateTable<Person, UnitNavLv1, UnitNavLv2, UnitNavLv3_1, UnitNavLv3_2>();
var person = new Person
{
Name = "John Doe"
};
var lv1Data = new UnitNavLv1
{
Name = "Level 1",
lv2s = new List<UnitNavLv2>
{
new UnitNavLv2
{
Name = "Level 2-1",
person = person,
lv3s_1 = new List<UnitNavLv3_1>
{
new UnitNavLv3_1 { Name = "Level 3-1" },
new UnitNavLv3_1 { Name = "Level 3-2" }
},
lv3s_2 = new List<UnitNavLv3_2>
{
new UnitNavLv3_2 { Name = "Level 3-3" }
}
},
new UnitNavLv2
{
Name = "Level 2-2",
lv3s_1 = new List<UnitNavLv3_1>
{
new UnitNavLv3_1 { Name = "Level 3-4" }
}
}
}
};
db.InsertNav(lv1Data)
.Include(x => x.lv2s)
.ThenInclude(x => x.lv3s_1)
.Include(x => x.lv2s, new InsertNavOptions() { OneToManyIfExistsNoInsert = true })
.ThenInclude(x => x.lv3s_2)
.Include(x => x.lv2s, new InsertNavOptions() { OneToManyIfExistsNoInsert = true })
.ThenInclude(x => x.person)
.ExecuteCommand();
// int addressId = db.InsertNav(lv1).Insertable(address).ExecuteReturnIdentity();
// // 创建 UnitPerson011 对象并插入记录
// var person = new UnitPerson011
// {
// Name = "John Doe",
// AddressId = addressId
// };
// int personId = db.Insertable(person).ExecuteReturnIdentity();
var list = db.Queryable<UnitNavLv1>()
// 导航2和3层有多个3层所以后面要多写下一次Include
.Includes(lv1 => lv1.lv2s.ToList(lv2 => new UnitNavLv2
{
// 模拟查指定字段
Name = lv2.Name,
personName1=lv2.person.Name
}), lv2 => lv2.lv3s_1.ToList(lv3 => new UnitNavLv3_1
{
// 模拟查指定字段
Name = lv3.Name
}))
// 问题1只为了给2层导航另外一个3层这里1和2层指定字段不需要多写一次ToList吧??
.Includes(lv1 => lv1.lv2s, lv2 => lv2.lv3s_2.ToList(lv3 => new UnitNavLv3_2
{
// 模拟查指定字段
Name = lv3.Name
}))
.Select(x1 => new
{
x1.Id,
x1.Name,
otherName = x1.lv2s
})
.ToList();
if (list.First().otherName[0].lv3s_1.Count() == 0)
{
throw new Exception("unit error");
}
}
}
public class UnitNavLv1
{
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string? Name { get; set; }
[SqlSugar.Navigate(SqlSugar.NavigateType.OneToMany, nameof(UnitNavLv2.lv1Id))]
public List<UnitNavLv2>? lv2s { get; set; }
}
public class UnitNavLv2
{
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string? Name { get; set; }
public int lv1Id { get; set; }
[SqlSugar.Navigate(SqlSugar.NavigateType.OneToMany, nameof(UnitNavLv3_1.lv2Id))]
public List<UnitNavLv3_1>? lv3s_1 { get; set; }
[SqlSugar.Navigate(SqlSugar.NavigateType.OneToMany, nameof(UnitNavLv3_2.lv2Id))]
public List<UnitNavLv3_2>? lv3s_2 { get; set; }
[SqlSugar.SugarColumn(IsNullable = true, DefaultValue = "0")]
public int? personId { get; set; }
[SqlSugar.Navigate(SqlSugar.NavigateType.OneToOne, nameof(personId))]
public Person? person { get; set; }
// 问题2只查1个字段 这个怎么用?没有找到用例
[SqlSugar.SugarColumn(IsIgnore = true)]
public string? personName { get => person?.Name; }
[SqlSugar.SugarColumn(IsIgnore = true)]
public string? personName1 { get; set; }
}
public class UnitNavLv3_1
{
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public int lv2Id { get; set; }
public string Name { get; set; }
}
public class UnitNavLv3_2
{
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public int lv2Id { get; set; }
public string Name { get; set; }
}
[SugarTable("unitPerson1231s")]
public class Person
{
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string? Name { get; set; }
}
}