mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +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;
|
_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)
|
||||||
{
|
{
|
||||||
|
@ -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<object> 后使用本方法,指定实体类型
|
动态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;
|
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()
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user