diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 594fbad32..26522f106 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,6 +733,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -791,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingNotFundTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingNotFundTest.cs index 1bded85f6..ea5d23415 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingNotFundTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingNotFundTest.cs @@ -63,8 +63,8 @@ namespace FreeSql.Tests.PostgreSQL.PgArrayToMany Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" FROM ""pgarray_tomany_user_lazyloading_notfound"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_role_lazyloading_notfound"" b - WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + FROM ""pgarray_tomany_role_lazyloading_notfound"" sub_b + WHERE (a.""roleids"" @> ARRAY[sub_b.""roleid""]::int4[]) AND (sub_b.""rolename"" = 'role1') limit 1))", users5Select.ToSql()); var users5 = users5Select.ToList(); Assert.Equal(4, users5.Count); @@ -82,8 +82,8 @@ WHERE (exists(SELECT 1 Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" FROM ""pgarray_tomany_role_lazyloading_notfound"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_user_lazyloading_notfound"" b - WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + FROM ""pgarray_tomany_user_lazyloading_notfound"" sub_b + WHERE (sub_b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (sub_b.""username"" = 'user1') limit 1))", roles5Select.ToSql()); var roles5 = roles5Select.ToList(); Assert.Equal(2, roles5.Count); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs index 834d83b8b..f939b3908 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/LazyLoadingTest .cs @@ -63,8 +63,8 @@ namespace FreeSql.Tests.PostgreSQL.PgArrayToMany Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" FROM ""pgarray_tomany_user_lazyloading"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_role_lazyloading"" b - WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + FROM ""pgarray_tomany_role_lazyloading"" sub_b + WHERE (a.""roleids"" @> ARRAY[sub_b.""roleid""]::int4[]) AND (sub_b.""rolename"" = 'role1') limit 1))", users5Select.ToSql()); var users5 = users5Select.ToList(); Assert.Equal(4, users5.Count); @@ -82,8 +82,8 @@ WHERE (exists(SELECT 1 Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" FROM ""pgarray_tomany_role_lazyloading"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_user_lazyloading"" b - WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + FROM ""pgarray_tomany_user_lazyloading"" sub_b + WHERE (sub_b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (sub_b.""username"" = 'user1') limit 1))", roles5Select.ToSql()); var roles5 = roles5Select.ToList(); Assert.Equal(2, roles5.Count); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs index a697dc625..db02b6136 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/NormalTest.cs @@ -63,8 +63,8 @@ namespace FreeSql.Tests.PostgreSQL.PgArrayToMany Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" FROM ""pgarray_tomany_user_normal"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_role_normal"" b - WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + FROM ""pgarray_tomany_role_normal"" sub_b + WHERE (a.""roleids"" @> ARRAY[sub_b.""roleid""]::int4[]) AND (sub_b.""rolename"" = 'role1') limit 1))", users5Select.ToSql()); var users5 = users5Select.ToList(); Assert.Equal(4, users5.Count); @@ -82,8 +82,8 @@ WHERE (exists(SELECT 1 Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" FROM ""pgarray_tomany_role_normal"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_user_normal"" b - WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + FROM ""pgarray_tomany_user_normal"" sub_b + WHERE (sub_b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (sub_b.""username"" = 'user1') limit 1))", roles5Select.ToSql()); var roles5 = roles5Select.ToList(); Assert.Equal(2, roles5.Count); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs index 29d9d271b..0e923cfed 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionLazyLoadingTest.cs @@ -63,8 +63,8 @@ namespace FreeSql.Tests.PostgreSQL.PgArrayToMany Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" FROM ""pgarray_tomany_user_observablecollection_lazyloading"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_role_observablecollection_lazyloading"" b - WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + FROM ""pgarray_tomany_role_observablecollection_lazyloading"" sub_b + WHERE (a.""roleids"" @> ARRAY[sub_b.""roleid""]::int4[]) AND (sub_b.""rolename"" = 'role1') limit 1))", users5Select.ToSql()); var users5 = users5Select.ToList(); Assert.Equal(4, users5.Count); @@ -82,8 +82,8 @@ WHERE (exists(SELECT 1 Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" FROM ""pgarray_tomany_role_observablecollection_lazyloading"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_user_observablecollection_lazyloading"" b - WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + FROM ""pgarray_tomany_user_observablecollection_lazyloading"" sub_b + WHERE (sub_b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (sub_b.""username"" = 'user1') limit 1))", roles5Select.ToSql()); var roles5 = roles5Select.ToList(); Assert.Equal(2, roles5.Count); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs index 671dadca4..052797afe 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PgArrayToMany/ObservableCollectionTest.cs @@ -64,8 +64,8 @@ namespace FreeSql.Tests.PostgreSQL.PgArrayToMany Assert.Equal(@"SELECT a.""userid"", a.""roleids"", a.""username"" FROM ""pgarray_tomany_user_observablecollection"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_role_observablecollection"" b - WHERE (a.""roleids"" @> ARRAY[b.""roleid""]::int4[]) AND (b.""rolename"" = 'role1') + FROM ""pgarray_tomany_role_observablecollection"" sub_b + WHERE (a.""roleids"" @> ARRAY[sub_b.""roleid""]::int4[]) AND (sub_b.""rolename"" = 'role1') limit 1))", users5Select.ToSql()); var users5 = users5Select.ToList(); Assert.Equal(4, users5.Count); @@ -83,8 +83,8 @@ WHERE (exists(SELECT 1 Assert.Equal(@"SELECT a.""roleid"", a.""rolename"" FROM ""pgarray_tomany_role_observablecollection"" a WHERE (exists(SELECT 1 - FROM ""pgarray_tomany_user_observablecollection"" b - WHERE (b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (b.""username"" = 'user1') + FROM ""pgarray_tomany_user_observablecollection"" sub_b + WHERE (sub_b.""roleids"" @> ARRAY[a.""roleid""]::int4[]) AND (sub_b.""username"" = 'user1') limit 1))", roles5Select.ToSql()); var roles5 = roles5Select.ToList(); Assert.Equal(2, roles5.Count); diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index e1054ddb8..38f085d6b 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -850,6 +850,13 @@ WHERE (((a.[Name]) in (SELECT s.[Title] as1 .Any() ).Any() ).ToList(); + + var sqlAliasA = select.Where(p => select.Where(a => a.Id == p.Id).Any()).ToSql(); + Assert.Equal(@"SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] +FROM [tb_topic22] a +WHERE (exists(SELECT TOP 1 1 + FROM [tb_topic22] sub_a + WHERE (sub_a.[Id] = a.[Id])))", sqlAliasA); } [Fact] public void GroupBy() diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 3285c8859..8898e5a71 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -1143,8 +1143,8 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title"" }); Assert.Equal(@"SELECT a.""Id"" as1, ifnull((SELECT max(a.""Guid"") FROM ""TestTypeInfo_01"" a), 0) as2, exists(SELECT 1 - FROM ""TestTypeInfo_01"" b - WHERE (b.""ParentId"" = a.""Id"") AND (b.""Name"" = 'xx') + FROM ""TestTypeInfo_01"" sub_b + WHERE (sub_b.""ParentId"" = a.""Id"") AND (sub_b.""Name"" = 'xx') limit 0,1) as3, exists(SELECT 1 FROM ""TestTypeInfo_01"" b WHERE (b.""Name"" = 'xx') AND (b.""ParentId"" = a.""Id"") diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index f0601e3b4..853e11c1e 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1286,7 +1286,11 @@ namespace FreeSql.Internal else { for (var gai = 0; gai < fsqlTypeGenericArgs.Length && gai < argExpLambda.Parameters.Count; gai++) - fsqltables[gai].Alias = argExpLambda.Parameters[gai].Name; + { + var alias = argExpLambda.Parameters[gai].Name; + if (fsqltables.Any(x => x.Type == SelectTableInfoType.Parent && x.Alias == alias)) alias = $"sub_{alias}"; + fsqltables[gai].Alias = alias; + } } } } @@ -2343,6 +2347,7 @@ namespace FreeSql.Internal void LocalSetSelectProviderAlias(string alias) { if (selectSetAliased) return; + if (new[] { "a", "b", "c", "d" }.Contains(alias)) alias = $"sub_{alias}"; selectSetAliased = true; select._tables[0].Alias = alias; select._tables[0].AliasInit = alias;