- 修复 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>
</member>
<member name="P:FreeSql.Tests.UnitTest2.Comment.Text">
<summary>
回复的文本内容
</summary>
</member>
<member name="T:SaleIDO.Entity.Storeage.AdjustPriceOrder">
<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]
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<SysModuleButton>().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()));
else
{
var findedIndexs = new List<int>();
var _multiTables = toType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(to) as List<SelectTableInfo>;
_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);