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);