From f49c5f2827af8a746baf467d4b15f557e741baab Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 14 Aug 2022 00:04:35 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=E5=AD=90=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BD=BF=E7=94=A8=E5=9F=BA=E7=B1=BB+AsType=20?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BA=A7=E7=94=9F=E7=9A=84=20bug=EF=BC=9B#12?= =?UTF-8?q?15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 12 ++++ FreeSql.DbContext/FreeSql.DbContext.xml | 9 --- .../Curd/SqlServerSelectWithTempQueryTest.cs | 72 +++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 9 ++- 4 files changed, 91 insertions(+), 11 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index bb296c0b..ce98c12d 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -317,8 +317,20 @@ namespace base_entity public Guid Id { get; set; } public string[] Tags { get; init; } = Array.Empty(); } + + class BaseModel + { + public static int fsql; + } + static void Main(string[] args) { + BaseModel.fsql = 1; + BaseModel.fsql = 2; + Console.WriteLine(BaseModel.fsql); + Console.WriteLine(BaseModel.fsql); + + #region 初始化 IFreeSql var fsql = new FreeSql.FreeSqlBuilder() .UseAutoSyncStructure(true) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index b12a8cf3..c99789e1 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -7,6 +7,78 @@ namespace FreeSql.Tests.SqlServer { public class SqlServerSelectWithTempQueryTest { + #region issues #1215 + + [Fact] + public void VicDemo20220813() + { + var fsql = g.sqlserver; + var id = Guid.Parse("62f83a6d-eb53-0608-0097-d177142cadcb"); + var sql1 = fsql.Select().AsType(typeof(BiEntity1)).As("bi") + .Where(bi => bi.HeadId == id && bi.IsDeleted == false) + .Where(bi => fsql.Select().AsType(typeof(BiEntity2)).As("ti") + .Where(ti => ti.RefHeadId == bi.HeadId && ti.RefItemId == bi.Id) + .Sum(ti => ti.Quantity) <= bi.Quantity) + .ToSql(); + Assert.Equal(@"SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId] +FROM [bie_1] bi +WHERE (bi.[HeadId] = '62f83a6d-eb53-0608-0097-d177142cadcb' AND bi.[IsDeleted] = 0) AND (isnull((SELECT sum(ti.[Quantity]) + FROM [bie_2] ti + WHERE (ti.[RefHeadId] = bi.[HeadId] AND ti.[RefItemId] = bi.[Id])), 0) <= bi.[Quantity])", sql1); + + var sql2 = fsql.Select().AsType(typeof(BiEntity1)).As("bi") + .Where(bi => bi.HeadId == id && bi.IsDeleted == false) + .Where(bi => bi.HeadId == id && bi.IsDeleted == false) + .WithTempQuery(bi => new + { + bi.Id, + BillItem = bi, + bi.Quantity, + RefQuantity = fsql.Select().AsType(typeof(BiEntity2)).As("ti") + .Where(ti => ti.RefHeadId == bi.HeadId && ti.RefItemId == bi.Id) + .Sum(ti => ti.Quantity), + }) + .Where(v => v.RefQuantity < v.Quantity) + .ToSql(); + Assert.Equal(@"SELECT * +FROM ( + SELECT bi.[Id], bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId], bi.[Quantity], isnull((SELECT sum(ti.[Quantity]) + FROM [bie_2] ti + WHERE (ti.[RefHeadId] = bi.[HeadId] AND ti.[RefItemId] = bi.[Id])), 0) [RefQuantity] + FROM [bie_1] bi + WHERE (bi.[HeadId] = '62f83a6d-eb53-0608-0097-d177142cadcb' AND bi.[IsDeleted] = 0) AND (bi.[HeadId] = '62f83a6d-eb53-0608-0097-d177142cadcb' AND bi.[IsDeleted] = 0) ) a +WHERE (a.[RefQuantity] < a.[Quantity])", sql2); + } + + abstract class SoftDelete + { + public bool IsDeleted { get; set; } + } + abstract class BaseHeadEntity : SoftDelete + { + public Guid Id { get; set; } + public string No { get; set; } + public DateTime Date { get; set; } + } + [Table(Name = "bhe_1")] + class BhEntity1 : BaseHeadEntity { } + [Table(Name = "bhe_2")] + class BhEntity2 : BaseHeadEntity { } + abstract class BaseItemEntity : SoftDelete + { + public Guid Id { get; set; } + public Guid HeadId { get; set; } + public int GoodsId { get; set; } + public decimal Quantity { get; set; } + public Guid? RefHeadId { get; set; } + public Guid? RefItemId { get; set; } + } + [Table(Name = "bie_1")] + class BiEntity1 : BaseItemEntity { } + [Table(Name = "bie_2")] + class BiEntity2 : BaseItemEntity { } + #endregion + [Fact] public void SingleTablePartitionBy() { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index aeddf4fa..76cb1182 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1767,13 +1767,18 @@ namespace FreeSql.Internal if (finds.Length != 1) { finds = tsc._tables.Where(a2 => (isa && a2.Parameter != null || isa && a2.Parameter == null) && - a2.Table.Type == tbtmp.Type).ToArray(); + tbtmp.Type.IsAssignableFrom(a2.Table.Type) && a2.Alias == alias).ToArray(); if (finds.Length != 1) { finds = tsc._tables.Where(a2 => (isa && a2.Parameter != null || isa && a2.Parameter == null) && a2.Table.Type == tbtmp.Type).ToArray(); if (finds.Length != 1) - finds = tsc._tables.Where(a2 => a2.Table.Type == tbtmp.Type).ToArray(); + { + finds = tsc._tables.Where(a2 => (isa && a2.Parameter != null || isa && a2.Parameter == null) && + a2.Table.Type == tbtmp.Type).ToArray(); + if (finds.Length != 1) + finds = tsc._tables.Where(a2 => a2.Table.Type == tbtmp.Type).ToArray(); + } } } }