- 修复 多表 ToList 非 a,b,c 别名相同实体 bug;#1830 #1861

This commit is contained in:
2881099 2024-07-25 01:00:56 +08:00
parent b024c54d01
commit 04a538ab42
5 changed files with 63 additions and 2 deletions

View File

@ -74,7 +74,6 @@ namespace FreeSql
_asTableRule = rule; _asTableRule = rule;
} }
public Type EntityType => _repository.EntityType; public Type EntityType => _repository.EntityType;
public IDataFilter<TEntity> DataFilter => _repository.DataFilter;
public void Attach(TEntity entity) public void Attach(TEntity entity)
{ {

View File

@ -480,6 +480,13 @@
FreeSql.Repository Update 失败,因为设置了过滤器 {filterKey}: {filterValueExpression},更新的数据不符合{entityString} FreeSql.Repository Update 失败,因为设置了过滤器 {filterKey}: {filterValueExpression},更新的数据不符合{entityString}
</summary> </summary>
</member> </member>
<member name="M:FreeSql.IRepositoryUnitOfWork.GetRepository``1">
<summary>
在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点
</summary>
<typeparam name="TEntity"></typeparam>
<returns></returns>
</member>
<member name="M:FreeSql.IBaseRepository.AsType(System.Type)"> <member name="M:FreeSql.IBaseRepository.AsType(System.Type)">
<summary> <summary>
动态Type在使用 Repository&lt;object&gt; 后使用本方法,指定实体类型 动态Type在使用 Repository&lt;object&gt; 后使用本方法,指定实体类型

View File

@ -0,0 +1,31 @@
using System;
using System.Linq.Expressions;
namespace FreeSql
{
public interface IRepositoryUnitOfWork : IUnitOfWork
{
/// <summary>
/// 在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <returns></returns>
IBaseRepository<TEntity> GetRepository<TEntity>() where TEntity : class;
}
class RepositoryUnitOfWork : UnitOfWork, IRepositoryUnitOfWork
{
public RepositoryUnitOfWork(IFreeSql fsql) : base(fsql)
{
}
public IBaseRepository<TEntity> GetRepository<TEntity>() where TEntity : class
{
var repo = new DefaultRepository<TEntity, int>(_fsql);
repo.UnitOfWork = this;
return repo;
}
}
}

View File

@ -21,6 +21,22 @@ namespace FreeSql.Tests.DbContext2
public override ISelect<Order> Select => base.SelectDiy; public override ISelect<Order> Select => base.SelectDiy;
} }
[Fact]
public void Test3()
{
using (var fsql = g.CreateMemory())
{
var sql01 = fsql.Select<Order, OrderDetail, OrderDetail>()
.InnerJoin((x, y, z) => y.OrderId == x.Id)
.InnerJoin((x, y, z) => z.OrderId == x.Id)
.ToSql((x, y, z) => new { x, y, z });
Assert.Equal(@"SELECT a.""Id"" as1, a.""Field2"" as2, b.""Id"" as3, b.""OrderId"" as4, b.""Field4"" as5, c.""Id"" as6, c.""OrderId"" as7, c.""Field4"" as8
FROM ""Order"" a
INNER JOIN ""OrderDetail"" b ON b.""OrderId"" = a.""Id""
INNER JOIN ""OrderDetail"" c ON c.""OrderId"" = a.""Id""", sql01);
}
}
[Fact] [Fact]
public void Test2() public void Test2()
{ {

View File

@ -1899,7 +1899,15 @@ namespace FreeSql.Internal
finds = tsc._tables.Where(a => a.Table.Type == tbtmp.Type && a.Alias == alias).ToArray(); finds = tsc._tables.Where(a => a.Table.Type == tbtmp.Type && a.Alias == alias).ToArray();
if (finds.Any() == false && alias.Contains("__") == false) if (finds.Any() == false && alias.Contains("__") == false)
finds = tsc._tables.Where(a => a.Table.Type == tbtmp.Type).ToArray(); finds = tsc._tables.Where(a => a.Table.Type == tbtmp.Type).ToArray();
if (finds.Any()) finds = new[] { finds.First() }; if (finds.Any())
{
if (finds.Length > 1 && isa && parmExp != null) //非 a,b,c 多表查询时 #1830
{
var tmpFinds = tsc._tables.Where(a => a.Parameter == parmExp).ToArray();
if (tmpFinds.Any()) finds = tmpFinds;
}
if (finds.Any()) finds = new[] { finds.First() };
}
} }
if (finds.Length != 1 && isa && parmExp != null) if (finds.Length != 1 && isa && parmExp != null)
finds = tsc._tables.Where(a => a.Parameter == parmExp).ToArray(); finds = tsc._tables.Where(a => a.Parameter == parmExp).ToArray();