mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 修复 多表 ToList 非 a,b,c 别名相同实体 bug;#1830 #1861
This commit is contained in:
parent
b024c54d01
commit
04a538ab42
@ -74,7 +74,6 @@ namespace FreeSql
|
||||
_asTableRule = rule;
|
||||
}
|
||||
public Type EntityType => _repository.EntityType;
|
||||
public IDataFilter<TEntity> DataFilter => _repository.DataFilter;
|
||||
|
||||
public void Attach(TEntity entity)
|
||||
{
|
||||
|
@ -480,6 +480,13 @@
|
||||
FreeSql.Repository Update 失败,因为设置了过滤器 {filterKey}: {filterValueExpression},更新的数据不符合{entityString}
|
||||
</summary>
|
||||
</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)">
|
||||
<summary>
|
||||
动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -21,6 +21,22 @@ namespace FreeSql.Tests.DbContext2
|
||||
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]
|
||||
public void Test2()
|
||||
{
|
||||
|
@ -1899,7 +1899,15 @@ namespace FreeSql.Internal
|
||||
finds = tsc._tables.Where(a => a.Table.Type == tbtmp.Type && a.Alias == alias).ToArray();
|
||||
if (finds.Any() == false && alias.Contains("__") == false)
|
||||
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)
|
||||
finds = tsc._tables.Where(a => a.Parameter == parmExp).ToArray();
|
||||
|
Loading…
x
Reference in New Issue
Block a user