From f2cb3bd5fe7887fb1ac6552333d71e1d2a558c42 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sun, 10 Nov 2019 20:53:39 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20ISelect=20.From=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=B9=8B=E5=89=8D=E4=BD=BF=E7=94=A8=20.Inclu?= =?UTF-8?q?de=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=AF=BC=E8=87=B4=E7=94=9F?= =?UTF-8?q?=E6=88=90=E7=9A=84=E5=A4=9A=E8=A1=A8=20JOIN=20=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E9=94=99=E8=AF=AF=E7=9A=84=20bug=EF=BC=9B#128?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 +++ FreeSql.Tests/FreeSql.Tests/UnitTest2.cs | 33 +++++++++++++++++++ .../SelectProvider/Select0Provider.cs | 16 ++++++--- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index b44b569a..21a0a7ed 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -199,6 +199,11 @@ 创建日期 + + + 回复的文本内容 + + 调价单 diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index 5234ee72..ba939607 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -137,10 +137,43 @@ namespace FreeSql.Tests { } + public class LinUser + { + public long id { get; set; } + } + + public class Comment + { + public Guid Id { get; set; } + /// + /// 回复的文本内容 + /// + public string Text { get; set; } + [Navigate("CreateUserId")] + public LinUser UserInfo { get; set; } + public long? CreateUserId { get; set; } + } + + public class UserLike + { + public Guid Id { get; set; } + public Guid SubjectId { get; set; } + public long? CreateUserId { get; set; } + } + [Fact] public void Test02() { + var comments1 = g.mysql.Select() + .LeftJoin((a, b) => a.Id == b.SubjectId) + .ToList((a, b) => new { comment = a, b.SubjectId, user = a.UserInfo }); + + var comments2 = g.mysql.Select() + .Include(r => r.UserInfo) + .From((z, b) => z.LeftJoin(u => u.Id == b.SubjectId)) + .ToList((a, b) => new { comment = a, b.SubjectId, user = a.UserInfo }); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 365de89d..4859985b 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -71,20 +71,28 @@ namespace FreeSql.Internal.CommonProvider toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, new List(from._tables.ToArray())); else { + var findedIndexs = new List(); var _multiTables = toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(to) as List; _multiTables[0] = from._tables[0]; for (var a = 1; a < lambParms.Count; a++) { - var tb = from._tables.Where(b => b.Alias == lambParms[a].Name && b.Table.Type == lambParms[a].Type).FirstOrDefault(); - if (tb != null) _multiTables[a] = tb; + var tbIndex = from._tables.FindIndex(b => b.Alias == lambParms[a].Name && b.Table.Type == lambParms[a].Type); ; + if (tbIndex != -1) + { + findedIndexs.Add(tbIndex); + _multiTables[a] = from._tables[tbIndex]; + } else { _multiTables[a].Alias = lambParms[a].Name; _multiTables[a].Parameter = lambParms[a]; } } - if (_multiTables.Count < from._tables.Count) - _multiTables.AddRange(from._tables.GetRange(_multiTables.Count, from._tables.Count - _multiTables.Count)); + for (var a = 1; a < from._tables.Count; a++) + { + if (findedIndexs.Contains(a)) continue; + _multiTables.Add(from._tables[a]); + } } toType.GetField("_tableRules", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._tableRules); toType.GetField("_aliasRule", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._aliasRule);