mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 优化 IncludeMany 三级导航对象自动 _included;#1113
This commit is contained in:
		
							
								
								
									
										128
									
								
								FreeSql.Tests/FreeSql.Tests/Issues/1113.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								FreeSql.Tests/FreeSql.Tests/Issues/1113.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
using FreeSql.DataAnnotations;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Tests.Issues
 | 
			
		||||
{
 | 
			
		||||
    public class _1113
 | 
			
		||||
    {
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void PadLeft()
 | 
			
		||||
        {
 | 
			
		||||
            using (var freeSql = new FreeSqlBuilder()
 | 
			
		||||
                .UseConnectionString(DataType.Sqlite, "Data Source=:memory:;")
 | 
			
		||||
                .UseAutoSyncStructure(true)
 | 
			
		||||
                .Build())
 | 
			
		||||
            {
 | 
			
		||||
                freeSql.Aop.CurdBefore += (s, e) =>
 | 
			
		||||
                {
 | 
			
		||||
                    Trace.WriteLine(e.Sql);
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                var company = new Company { Id = Guid.NewGuid(), Code = "CO001" };
 | 
			
		||||
                var department = new Department { Id = Guid.NewGuid(), Code = "D001", CompanyId = company.Id };
 | 
			
		||||
                var orgnization = new Orgnization { Code = "C001", CompanyId = company.Id };
 | 
			
		||||
                freeSql.Insert(company).ExecuteAffrows();
 | 
			
		||||
                freeSql.Insert(orgnization).ExecuteAffrows();
 | 
			
		||||
                freeSql.Insert(department).ExecuteAffrows();
 | 
			
		||||
 | 
			
		||||
                var materials = new[]
 | 
			
		||||
                {
 | 
			
		||||
                    new Material{Code="TEST1",Units=new List<Unit>{new Unit{Code = "KG"}}},
 | 
			
		||||
                    new Material{Code="TEST2",Units=new List<Unit>{new Unit{Code = "KG"}}}
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                var repo1 = freeSql.GetGuidRepository<Material>();
 | 
			
		||||
                repo1.DbContextOptions.EnableCascadeSave = true;
 | 
			
		||||
                repo1.Insert(materials);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                var order = new Order
 | 
			
		||||
                {
 | 
			
		||||
                    Code = "X001",
 | 
			
		||||
                    OrgnizationId = orgnization.Id,
 | 
			
		||||
                    OrderItems = new List<OrderItem>
 | 
			
		||||
                    {
 | 
			
		||||
                        new OrderItem{ ItemCode = "01", MaterialId = materials[0].Id },
 | 
			
		||||
                        new OrderItem { ItemCode = "02", MaterialId = materials[1].Id },
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                var repo2 = freeSql.GetGuidRepository<Order>();
 | 
			
		||||
                repo2.DbContextOptions.EnableCascadeSave = true;
 | 
			
		||||
                repo2.Insert(order);
 | 
			
		||||
 | 
			
		||||
                // 可以完整加载数据
 | 
			
		||||
                var list1 = freeSql.Select<Orgnization>().IncludeMany(t => t.Company.Departments).ToList();
 | 
			
		||||
                // 只能查询到Orgnization
 | 
			
		||||
                var list2 = freeSql.Select<Order>().IncludeMany(t => t.Orgnization.Company.Departments).ToList();
 | 
			
		||||
                //freeSql.Select<Order>().IncludeMany(t => t.OrderItems, then => then.IncludeMany(t => t.Material.Units)).ToList().Dump();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public class Order
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string Code { get; set; }
 | 
			
		||||
            public Guid OrgnizationId { get; set; }
 | 
			
		||||
            [Navigate(nameof(OrgnizationId))]
 | 
			
		||||
            public Orgnization Orgnization { get; set; }
 | 
			
		||||
            [Navigate(nameof(OrderItem.OrderId))]
 | 
			
		||||
            public List<OrderItem> OrderItems { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class OrderItem
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string ItemCode { get; set; }
 | 
			
		||||
            public Guid MaterialId { get; set; }
 | 
			
		||||
            public Guid OrderId { get; set; }
 | 
			
		||||
            [Navigate(nameof(MaterialId))]
 | 
			
		||||
            public Material Material { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class Orgnization
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string Code { get; set; }
 | 
			
		||||
            public Guid CompanyId { get; set; }
 | 
			
		||||
            [Navigate(nameof(CompanyId))]
 | 
			
		||||
            public Company Company { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class Company
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string Code { get; set; }
 | 
			
		||||
            [Navigate(nameof(Department.CompanyId))]
 | 
			
		||||
            public List<Department> Departments { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class Department
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string Code { get; set; }
 | 
			
		||||
            public Guid CompanyId { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class Material
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string Code { get; set; }
 | 
			
		||||
            [Navigate(nameof(Unit.MaterialId))]
 | 
			
		||||
            public List<Unit> Units { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public class Unit
 | 
			
		||||
        {
 | 
			
		||||
            public Guid Id { get; set; }
 | 
			
		||||
            public string Code { get; set; }
 | 
			
		||||
            public Guid MaterialId { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -641,6 +641,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                if (tbref.Columns.Any() == false) throw throwNavigateSelector;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (members.Count >= 2) _isIncluded = true;
 | 
			
		||||
#if net40
 | 
			
		||||
            Action<object, bool> includeToListSyncOrAsync = (listObj, isAsync) =>
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user