diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs index 766288cd..7ecc7341 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteExpression/OtherTest.cs @@ -1,4 +1,5 @@ using FreeSql.DataAnnotations; +using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; using System.Diagnostics; @@ -181,6 +182,91 @@ WHERE (('name01' = a.""Name"" AND 1 = a.""Click"" OR a.""Click"" > 10) OR ('name var sql1133333 = select.Where(a => !inarray2n.Contains(a.Int)).ToList(); } + [Fact] + public void SubSelectUseGenerateCommandParameterWithLambda() + { + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, "data source=:memory:") + .UseConnectionString(DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=issues684;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") + .UseGenerateCommandParameterWithLambda(true) + .UseAutoSyncStructure(true) + .UseMonitorCommand(null, (cmd, log) => Trace.WriteLine(log)) + .Build()) + { + var guidval = Guid.NewGuid(); + var strval = "nameval"; + var timeval = DateTime.Now; + var decval1 = 1.1M; + var decval2 = 2.2M; + + var subselect = fsql.Select(); + var sql = subselect.ToSql(a => new + { + a.id, a.name, a.createTime, + sum1 = fsql.Select().Where(b => b.Guid == guidval).Sum(b => b.Int), + sum2 = fsql.Select().Where(b => b.String == strval).Sum(b => b.Long), + sum3 = fsql.Select().Where(b => b.DateTime == timeval).Sum(b => b.Decimal), + sum4 = fsql.Select().Where(b => b.Decimal == decval1).Sum(b => b.Decimal), + sum5 = fsql.Select().Where(b => b.Decimal == decval2).Sum(b => b.Decimal), + }); + var subselect0 = subselect as Select0Provider; + Assert.Equal(5, subselect0._params.Count); + Assert.Equal("@exp_0", subselect0._params[0].ParameterName); + Assert.Equal("@exp_1", subselect0._params[1].ParameterName); + Assert.Equal("@exp_2", subselect0._params[2].ParameterName); + Assert.Equal("@exp_3", subselect0._params[3].ParameterName); + Assert.Equal("@exp_4", subselect0._params[4].ParameterName); + Assert.Equal(@"SELECT a.[id] as1, a.[name] as2, a.[createTime] as3, isnull((SELECT sum(b.[Int]) + FROM [tb_alltype] b + WHERE (b.[Guid] = @exp_0)), 0) as4, isnull((SELECT sum(b.[Long]) + FROM [tb_alltype] b + WHERE (b.[String] = @exp_1)), 0) as5, isnull((SELECT sum(b.[Decimal]) + FROM [tb_alltype] b + WHERE (b.[DateTime] = @exp_2)), 0) as6, isnull((SELECT sum(b.[Decimal]) + FROM [tb_alltype] b + WHERE (b.[Decimal] = @exp_3)), 0) as7, isnull((SELECT sum(b.[Decimal]) + FROM [tb_alltype] b + WHERE (b.[Decimal] = @exp_4)), 0) as8 +FROM [ssugcpwl01] a", sql); + + var groupselect = fsql.Select().GroupBy(a => a.name); + sql = groupselect.ToSql(a => new + { + a.Key, + sum1 = fsql.Select().Where(b => b.Guid == guidval).Sum(b => b.Int), + sum2 = fsql.Select().Where(b => b.String == strval).Sum(b => b.Long), + sum3 = fsql.Select().Where(b => b.DateTime == timeval).Sum(b => b.Decimal), + sum4 = fsql.Select().Where(b => b.Decimal == decval1).Sum(b => b.Decimal), + sum5 = fsql.Select().Where(b => b.Decimal == decval2).Sum(b => b.Decimal), + }); + var groupselect0 = groupselect as SelectGroupingProvider; + Assert.Equal(5, groupselect0._select._params.Count); + Assert.Equal("@exp_0", groupselect0._select._params[0].ParameterName); + Assert.Equal("@exp_1", groupselect0._select._params[1].ParameterName); + Assert.Equal("@exp_2", groupselect0._select._params[2].ParameterName); + Assert.Equal("@exp_3", groupselect0._select._params[3].ParameterName); + Assert.Equal("@exp_4", groupselect0._select._params[4].ParameterName); + Assert.Equal(@"SELECT a.[name] as1, isnull((SELECT sum(b.[Int]) + FROM [tb_alltype] b + WHERE (b.[Guid] = @exp_0)), 0) as2, isnull((SELECT sum(b.[Long]) + FROM [tb_alltype] b + WHERE (b.[String] = @exp_1)), 0) as3, isnull((SELECT sum(b.[Decimal]) + FROM [tb_alltype] b + WHERE (b.[DateTime] = @exp_2)), 0) as4, isnull((SELECT sum(b.[Decimal]) + FROM [tb_alltype] b + WHERE (b.[Decimal] = @exp_3)), 0) as5, isnull((SELECT sum(b.[Decimal]) + FROM [tb_alltype] b + WHERE (b.[Decimal] = @exp_4)), 0) as6 +FROM [ssugcpwl01] a +GROUP BY a.[name]", sql); + } + } + class ssugcpwl01 + { + public Guid id { get; set; } + public string name { get; set; } + public DateTime createTime { get; set; } + } [Fact] public void ArrayUseGenerateCommandParameterWithLambda() { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index f9d3a108..7a69e81a 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -173,7 +173,7 @@ namespace FreeSql.Internal } else { - if (select != null && findIncludeMany != null && select._includeToList.Any() && exp.Type.IsGenericType && + if (_tables != null && select != null && findIncludeMany != null && select._includeToList.Any() && exp.Type.IsGenericType && typeof(IEnumerable).IsAssignableFrom(exp.Type) && typeof(ICollection<>).MakeGenericType(exp.Type.GetGenericArguments().FirstOrDefault()).IsAssignableFrom(exp.Type)) { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 8b720709..e8a45ab5 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -115,7 +115,7 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = 0; - _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, select, null, this, null, null, null, false); + _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, select, _select, this, null, null, null, false); if (map.Childs.Any() == false && map.MapType == null) map.MapType = elementType; var method = _select.GetType().GetMethod("ToListMrPrivate", BindingFlags.Instance | BindingFlags.NonPublic); method = method.MakeGenericMethod(elementType); @@ -128,7 +128,7 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = 0; - _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, elementSelector, null, this, null, null, null, false); + _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, elementSelector, _select, this, null, null, null, false); if (map.Childs.Any() == false && map.MapType == null) map.MapType = elementType; var method = _select.GetType().GetMethod("ToListMrPrivate", BindingFlags.Instance | BindingFlags.NonPublic); method = method.MakeGenericMethod(elementType); @@ -143,7 +143,7 @@ namespace FreeSql.Internal.CommonProvider var field = new StringBuilder(); var index = fieldAlias == FieldAliasOptions.AsProperty ? CommonExpression.ReadAnonymousFieldAsCsName : 0; - _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, select, null, this, null, null, null, false); + _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, select, _select, this, null, null, null, false); var fieldSql = field.Length > 0 ? field.Remove(0, 2).ToString() : null; return InternalToSql(fieldSql); } @@ -269,7 +269,7 @@ namespace FreeSql.Internal.CommonProvider var index = 0; _lambdaParameter = select?.Parameters[0]; - _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, select, null, this, null, null, null, false); + _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, select, _select, this, null, null, null, false); if (map.Childs.Any() == false && map.MapType == null) map.MapType = typeof(TReturn); var method = _select.GetType().GetMethod("ToListMrPrivateAsync", BindingFlags.Instance | BindingFlags.NonPublic); method = method.MakeGenericMethod(typeof(TReturn)); @@ -283,7 +283,7 @@ namespace FreeSql.Internal.CommonProvider var index = 0; _lambdaParameter = elementSelector?.Parameters[0]; - _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, elementSelector, null, this, null, null, null, false); + _comonExp.ReadAnonymousField(null, _select._tableRule, field, map, ref index, elementSelector, _select, this, null, null, null, false); if (map.Childs.Any() == false && map.MapType == null) map.MapType = typeof(TElement); var method = _select.GetType().GetMethod("ToListMrPrivateAsync", BindingFlags.Instance | BindingFlags.NonPublic); method = method.MakeGenericMethod(typeof(TElement));