diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 8a820599..218e2d35 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -149,11 +149,13 @@ namespace FreeSql.Tests.MySql { var testDto2 = select.Limit(10).ToList(a => new TestDto()); var testDto3 = select.Limit(10).ToList(a => new TestDto { }); var testDto4 = select.Limit(10).ToList(a => new TestDto() { }); + var testDto5 = select.Limit(10).ToList(); var testDto11 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title }); var testDto22 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto()); var testDto33 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto { }); var testDto44 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto() { }); + var testDto55 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(); var t0 = select.Limit(50).ToList(); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 3f15647c..d4e5bcfc 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -988,6 +988,13 @@ 选择列 + + + 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Count 为 0 的列表 + + + + 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index b824b665..ad53e04f 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -30,6 +30,13 @@ namespace FreeSql { /// List ToList(Expression> select); Task> ToListAsync(Expression> select); + /// + /// 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Count 为 0 的列表 + /// + /// + /// + List ToList(); + Task> ToListAsync(); /// /// 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 diff --git a/FreeSql/Interface/Curd/ISelect/ISelect10.cs b/FreeSql/Interface/Curd/ISelect/ISelect10.cs index 8f2f7d5b..0d4ef4cb 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect10.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect10.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect2.cs b/FreeSql/Interface/Curd/ISelect/ISelect2.cs index aff7f5e2..3ca335e5 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect2.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect2.cs @@ -15,6 +15,9 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); + string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect3.cs b/FreeSql/Interface/Curd/ISelect/ISelect3.cs index 0d965e21..ae8c0c31 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect3.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect3.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect4.cs b/FreeSql/Interface/Curd/ISelect/ISelect4.cs index d662d788..9e0ef889 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect4.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect4.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect5.cs b/FreeSql/Interface/Curd/ISelect/ISelect5.cs index ffcf4294..56fde4d2 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect5.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect5.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect6.cs b/FreeSql/Interface/Curd/ISelect/ISelect6.cs index 30ebba85..e56ed98d 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect6.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect6.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect7.cs b/FreeSql/Interface/Curd/ISelect/ISelect7.cs index 21631412..318b6ee9 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect7.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect7.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect8.cs b/FreeSql/Interface/Curd/ISelect/ISelect8.cs index e30882f8..55db9df2 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect8.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect8.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect9.cs b/FreeSql/Interface/Curd/ISelect/ISelect9.cs index d3c827ca..5546f566 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect9.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect9.cs @@ -15,6 +15,8 @@ namespace FreeSql { List ToList(Expression> select); Task> ToListAsync(Expression> select); + List ToList(); + Task> ToListAsync(); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index 71adbbc1..0e2f6950 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -115,12 +115,27 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d"), + Expression.Parameter(typeof(T5), "e"), + Expression.Parameter(typeof(T6), "f"), + Expression.Parameter(typeof(T7), "g"), + Expression.Parameter(typeof(T8), "h"), + Expression.Parameter(typeof(T9), "i"), + Expression.Parameter(typeof(T10), "j")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 2f5cdd11..26b9f6ea 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -147,13 +147,20 @@ namespace FreeSql.Internal.CommonProvider { _tables[0].Parameter = select.Parameters[0]; return this.InternalToList(select?.Body); } - public Task> ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); _tables[0].Parameter = select.Parameters[0]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a")); + } + #region linq to sql public ISelect Select(Expression> select) where TReturn : class { if (typeof(TReturn) == typeof(T1)) return this as ISelect; _tables[0].Parameter = select.Parameters[0]; @@ -217,6 +224,7 @@ namespace FreeSql.Internal.CommonProvider { public ISelect DefaultIfEmpty() { return this; } + #endregion public DataTable ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs index 21b124a3..1dc5e90a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs @@ -99,12 +99,19 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index add6d4bf..fb04aefa 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -101,12 +101,20 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index 358015ad..410d0a7c 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -97,12 +97,21 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToAggregateAsync(select?.Body); } - List ISelect.ToList(Expression> select) { if (select == null) return this.InternalToList(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d")); + } Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index c42d5e59..f65d5dad 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -105,12 +105,22 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d"), + Expression.Parameter(typeof(T5), "e")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index 497ee66f..e565a625 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -107,12 +107,23 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d"), + Expression.Parameter(typeof(T5), "e"), + Expression.Parameter(typeof(T6), "f")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 75c70ea4..1442cc2d 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -109,12 +109,24 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d"), + Expression.Parameter(typeof(T5), "e"), + Expression.Parameter(typeof(T6), "f"), + Expression.Parameter(typeof(T7), "g")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index 1abc8e53..d86f08e9 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -111,12 +111,25 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d"), + Expression.Parameter(typeof(T5), "e"), + Expression.Parameter(typeof(T6), "f"), + Expression.Parameter(typeof(T7), "g"), + Expression.Parameter(typeof(T8), "h")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 64b8e466..58cfe03a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -113,12 +113,26 @@ namespace FreeSql.Internal.CommonProvider { for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToList(select?.Body); } - Task> ISelect.ToListAsync(Expression> select) { if (select == null) return this.InternalToListAsync(select?.Body); for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToListAsync(select?.Body); } + List ISelect.ToList() => (this as ISelect).ToList(GetToListDtoSelector()); + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + Expression> GetToListDtoSelector() { + var ctor = typeof(TDto).GetConstructor(new Type[0]); + return Expression.Lambda>(Expression.New(ctor), + _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"), + Expression.Parameter(typeof(T2), "b"), + Expression.Parameter(typeof(T3), "c"), + Expression.Parameter(typeof(T4), "d"), + Expression.Parameter(typeof(T5), "e"), + Expression.Parameter(typeof(T6), "f"), + Expression.Parameter(typeof(T7), "g"), + Expression.Parameter(typeof(T8), "h"), + Expression.Parameter(typeof(T9), "i")); + } DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body);