- 修复 ISelect .From 方法之前使用 .Include 方法,导致生成的多表 JOIN 位置错误的 bug;#128

This commit is contained in:
28810 2019-11-10 20:53:39 +08:00
parent 08bd86ae40
commit f2cb3bd5fe
3 changed files with 50 additions and 4 deletions

View File

@ -199,6 +199,11 @@
创建日期 创建日期
</summary> </summary>
</member> </member>
<member name="P:FreeSql.Tests.UnitTest2.Comment.Text">
<summary>
回复的文本内容
</summary>
</member>
<member name="T:SaleIDO.Entity.Storeage.AdjustPriceOrder"> <member name="T:SaleIDO.Entity.Storeage.AdjustPriceOrder">
<summary> <summary>
调价单 调价单

View File

@ -137,10 +137,43 @@ namespace FreeSql.Tests
{ {
} }
public class LinUser
{
public long id { get; set; }
}
public class Comment
{
public Guid Id { get; set; }
/// <summary>
/// 回复的文本内容
/// </summary>
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] [Fact]
public void Test02() public void Test02()
{ {
var comments1 = g.mysql.Select<Comment, UserLike>()
.LeftJoin((a, b) => a.Id == b.SubjectId)
.ToList((a, b) => new { comment = a, b.SubjectId, user = a.UserInfo });
var comments2 = g.mysql.Select<Comment>()
.Include(r => r.UserInfo)
.From<UserLike>((z, b) => z.LeftJoin(u => u.Id == b.SubjectId))
.ToList((a, b) => new { comment = a, b.SubjectId, user = a.UserInfo });
g.sqlite.Delete<SysModulePermission>().Where("1=1").ExecuteAffrows(); g.sqlite.Delete<SysModulePermission>().Where("1=1").ExecuteAffrows();
g.sqlite.Delete<SysModuleButton>().Where("1=1").ExecuteAffrows(); g.sqlite.Delete<SysModuleButton>().Where("1=1").ExecuteAffrows();
g.sqlite.Delete<SysModule>().Where("1=1").ExecuteAffrows(); g.sqlite.Delete<SysModule>().Where("1=1").ExecuteAffrows();

View File

@ -71,20 +71,28 @@ namespace FreeSql.Internal.CommonProvider
toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, new List<SelectTableInfo>(from._tables.ToArray())); toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, new List<SelectTableInfo>(from._tables.ToArray()));
else else
{ {
var findedIndexs = new List<int>();
var _multiTables = toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(to) as List<SelectTableInfo>; var _multiTables = toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(to) as List<SelectTableInfo>;
_multiTables[0] = from._tables[0]; _multiTables[0] = from._tables[0];
for (var a = 1; a < lambParms.Count; a++) 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(); var tbIndex = from._tables.FindIndex(b => b.Alias == lambParms[a].Name && b.Table.Type == lambParms[a].Type); ;
if (tb != null) _multiTables[a] = tb; if (tbIndex != -1)
{
findedIndexs.Add(tbIndex);
_multiTables[a] = from._tables[tbIndex];
}
else else
{ {
_multiTables[a].Alias = lambParms[a].Name; _multiTables[a].Alias = lambParms[a].Name;
_multiTables[a].Parameter = lambParms[a]; _multiTables[a].Parameter = lambParms[a];
} }
} }
if (_multiTables.Count < from._tables.Count) for (var a = 1; a < from._tables.Count; a++)
_multiTables.AddRange(from._tables.GetRange(_multiTables.Count, from._tables.Count - _multiTables.Count)); {
if (findedIndexs.Contains(a)) continue;
_multiTables.Add(from._tables[a]);
}
} }
toType.GetField("_tableRules", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._tableRules); toType.GetField("_tableRules", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._tableRules);
toType.GetField("_aliasRule", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._aliasRule); toType.GetField("_aliasRule", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._aliasRule);