diff --git a/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs b/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs index 639af244..c5cd5b10 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs @@ -79,7 +79,7 @@ namespace FreeSql.Tests.MySql { var items = new List(); for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 }); - Assert.Throws(() => insert.AppendData(items.First()).ExecuteInserted()); + insert.AppendData(items.First()).ExecuteInserted(); } } } diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs index b60fe033..8d149116 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs @@ -13,7 +13,7 @@ namespace FreeSql.Tests.SqlServer { class Topic { [Column(IsIdentity = true, IsPrimary = true)] public int Id { get; set; } - public int Clicks { get; set; } + public int? Clicks { get; set; } public TestTypeInfo Type { get; set; } public string Title { get; set; } public DateTime CreateTime { get; set; } diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 170b2e11..7293b4ec 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -3,7 +3,7 @@ netstandard2.0 0.0.0.1 - 0.0.2 + 0.0.3 0.0.0.0 true diff --git a/FreeSql/Interface/Curd/IDelete.cs b/FreeSql/Interface/Curd/IDelete.cs index ebb31e0e..76bd172f 100644 --- a/FreeSql/Interface/Curd/IDelete.cs +++ b/FreeSql/Interface/Curd/IDelete.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface IDelete where T1 : class { @@ -47,11 +48,13 @@ namespace FreeSql { /// 执行SQL语句,返回影响的行数 /// /// - long ExecuteAffrows(); + int ExecuteAffrows(); + Task ExecuteAffrowsAsync(); /// /// 执行SQL语句,返回被删除的记录 /// /// List ExecuteDeleted(); + Task> ExecuteDeletedAsync(); } } \ No newline at end of file diff --git a/FreeSql/Interface/Curd/IInsert.cs b/FreeSql/Interface/Curd/IInsert.cs index 113df414..be0c9c57 100644 --- a/FreeSql/Interface/Curd/IInsert.cs +++ b/FreeSql/Interface/Curd/IInsert.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface IInsert where T1 : class { @@ -40,16 +41,19 @@ namespace FreeSql { /// 执行SQL语句,返回影响的行数 /// /// - long ExecuteAffrows(); + int ExecuteAffrows(); + Task ExecuteAffrowsAsync(); /// /// 执行SQL语句,返回自增值 /// /// long ExecuteIdentity(); + Task ExecuteIdentityAsync(); /// /// 执行SQL语句,返回插入后的记录 /// /// List ExecuteInserted(); + Task> ExecuteInsertedAsync(); } } \ No newline at end of file diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index 195bdc50..81b02672 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect0 { @@ -11,6 +12,7 @@ namespace FreeSql { /// /// List ToList(); + Task> ToListAsync(); /// /// 执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表 /// @@ -18,11 +20,13 @@ namespace FreeSql { /// /// List ToList(string field); + Task> ToListAsync(string field); /// /// 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null /// /// T1 ToOne(); + Task ToOneAsync(); /// /// 返回即将执行的SQL语句 @@ -35,12 +39,14 @@ namespace FreeSql { /// /// bool Any(); + Task AnyAsync(); /// /// 查询的记录数量 /// /// long Count(); + Task CountAsync(); /// /// 查询的记录数量,以参数out形式返回 /// diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index 2506a7bd..5e13ee03 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class { @@ -12,6 +13,7 @@ namespace FreeSql { /// 选择列 /// List ToList(Expression> select); + Task> ToListAsync(Expression> select); /// /// 返回即将执行的SQL语句 /// @@ -27,6 +29,7 @@ namespace FreeSql { /// /// TReturn ToAggregate(Expression, TReturn>> select); + Task ToAggregateAsync(Expression, TReturn>> select); /// /// 求和 @@ -35,6 +38,7 @@ namespace FreeSql { /// 列 /// TMember Sum(Expression> column); + Task SumAsync(Expression> column); /// /// 最小值 /// @@ -42,6 +46,7 @@ namespace FreeSql { /// 列 /// TMember Min(Expression> column); + Task MinAsync(Expression> column); /// /// 最大值 /// @@ -49,6 +54,7 @@ namespace FreeSql { /// 列 /// TMember Max(Expression> column); + Task MaxAsync(Expression> column); /// /// 平均值 /// @@ -56,6 +62,7 @@ namespace FreeSql { /// 列 /// TMember Avg(Expression> column); + Task AvgAsync(Expression> column); /// /// 指定别名 diff --git a/FreeSql/Interface/Curd/ISelect/ISelect10.cs b/FreeSql/Interface/Curd/ISelect/ISelect10.cs index d534fc53..7b33c089 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect10.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect10.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); - TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect3.cs b/FreeSql/Interface/Curd/ISelect/ISelect3.cs index 2a7afd80..4dfb4661 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect3.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect3.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect4.cs b/FreeSql/Interface/Curd/ISelect/ISelect4.cs index ccf1501d..3bf0b5c0 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect4.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect4.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect5.cs b/FreeSql/Interface/Curd/ISelect/ISelect5.cs index 82ccd3af..181d3c40 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect5.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect5.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect6.cs b/FreeSql/Interface/Curd/ISelect/ISelect6.cs index 95709f3c..4a7709a9 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect6.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect6.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect7.cs b/FreeSql/Interface/Curd/ISelect/ISelect7.cs index 7064d061..9b92442e 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect7.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect7.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect8.cs b/FreeSql/Interface/Curd/ISelect/ISelect8.cs index 730c657f..a8d1c21c 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect8.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect8.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect9.cs b/FreeSql/Interface/Curd/ISelect/ISelect9.cs index d6554f38..b485fbf8 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect9.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect9.cs @@ -1,19 +1,26 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class { List ToList(Expression> select); + Task> ToListAsync(Expression> select); string ToSql(Expression> select); TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + Task ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); TMember Sum(Expression> column); + Task SumAsync(Expression> column); TMember Min(Expression> column); + Task MinAsync(Expression> column); TMember Max(Expression> column); + Task MaxAsync(Expression> column); TMember Avg(Expression> column); + Task AvgAsync(Expression> column); ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index b4a1e98b..830080ef 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; namespace FreeSql { public interface ISelectGrouping { @@ -33,6 +34,7 @@ namespace FreeSql { /// 选择列 /// List ToList(Expression, TReturn>> select); + Task> ToListAsync(Expression, TReturn>> select); /// /// 返回即将执行的SQL语句 diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs index 70df3a7e..a30cca63 100644 --- a/FreeSql/Interface/Curd/IUpdate.cs +++ b/FreeSql/Interface/Curd/IUpdate.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql { public interface IUpdate where T1 : class { @@ -90,11 +91,13 @@ namespace FreeSql { /// 执行SQL语句,返回影响的行数 /// /// - long ExecuteAffrows(); + int ExecuteAffrows(); + Task ExecuteAffrowsAsync(); /// /// 执行SQL语句,返回更新后的记录 /// /// List ExecuteUpdated(); + Task> ExecuteUpdatedAsync(); } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 44ff8826..9f7e990f 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -5,6 +5,7 @@ using System.Data; using System.Data.Common; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -28,12 +29,18 @@ namespace FreeSql.Internal.CommonProvider { if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(); } - public long ExecuteAffrows() { + public int ExecuteAffrows() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; return _orm.Ado.ExecuteNonQuery(CommandType.Text, sql, _params.ToArray()); } + async public Task ExecuteAffrowsAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + return await _orm.Ado.ExecuteNonQueryAsync(CommandType.Text, sql, _params.ToArray()); + } public abstract List ExecuteDeleted(); + public abstract Task> ExecuteDeletedAsync(); public IDelete Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, null, exp?.Body, null)); public IDelete Where(string sql, object parms = null) { diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 5cb9399a..c2f6cece 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -6,6 +6,7 @@ using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -35,9 +36,12 @@ namespace FreeSql.Internal.CommonProvider { return this; } - public long ExecuteAffrows() => _orm.Ado.ExecuteNonQuery(CommandType.Text, this.ToSql(), _params); + public int ExecuteAffrows() => _orm.Ado.ExecuteNonQuery(CommandType.Text, this.ToSql(), _params); + public Task ExecuteAffrowsAsync() => _orm.Ado.ExecuteNonQueryAsync(CommandType.Text, this.ToSql(), _params); public abstract long ExecuteIdentity(); + public abstract Task ExecuteIdentityAsync(); public abstract List ExecuteInserted(); + public abstract Task> ExecuteInsertedAsync(); public IInsert IgnoreColumns(Expression> columns) { var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, columns?.Body, false, null).Distinct(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 71e6e5e7..0c609f96 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -52,11 +53,18 @@ namespace FreeSql.Internal.CommonProvider { this.Limit(1); return this.ToList("1").FirstOrDefault() == 1; } + async public Task AnyAsync() { + this.Limit(1); + return (await this.ToListAsync("1")).FirstOrDefault() == 1; + } + public TSelect Caching(int seconds, string key = null) { _cache = (seconds, key); return this as TSelect; } public long Count() => this.ToList("count(1)").FirstOrDefault(); + async public Task CountAsync() => (await this.ToListAsync("count(1)")).FirstOrDefault(); + public TSelect Count(out long count) { count = this.Count(); return this as TSelect; @@ -146,12 +154,34 @@ namespace FreeSql.Internal.CommonProvider { return ret; }); } + public Task> ToListAsync(string field) { + var sql = this.ToSql(field); + if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; + + return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { + List ret = new List(); + Type type = typeof(TTuple); + var ds = await _orm.Ado.ExecuteArrayAsync(CommandType.Text, sql, _params.ToArray()); + foreach (var dr in ds) { + var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr); + ret.Add(read.value == null ? default(TTuple) : (TTuple)read.value); + } + return ret; + }); + } public List ToList() { return this.ToListMapReader(this.GetAllField()); } + public Task> ToListAsync() { + return this.ToListMapReaderAsync(this.GetAllField()); + } public T1 ToOne() { this.Limit(1); - return ToList().FirstOrDefault(); + return this.ToList().FirstOrDefault(); + } + async public Task ToOneAsync() { + this.Limit(1); + return (await this.ToListAsync()).FirstOrDefault(); } protected List ToListMapReader((ReadAnonymousTypeInfo map, string field) af) { @@ -167,6 +197,19 @@ namespace FreeSql.Internal.CommonProvider { } return ret; } + async protected Task> ToListMapReaderAsync((ReadAnonymousTypeInfo map, string field) af) { + var sql = this.ToSql(af.field); + if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; + + var drarr = await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, () => _orm.Ado.ExecuteArrayAsync(CommandType.Text, sql, _params.ToArray())); + var ret = new List(); + for (var a = 0; a < drarr.Length; a++) { + var dr = drarr[a]; + var index = -1; + ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index)); + } + return ret; + } protected (ReadAnonymousTypeInfo map, string field) GetNewExpressionField(NewExpression newexp) { var map = new ReadAnonymousTypeInfo(); var field = new StringBuilder(); @@ -201,7 +244,7 @@ namespace FreeSql.Internal.CommonProvider { foreach (var col2 in tb2.Table.Columns.Values) { if (index > 0) field.Append(", "); var quoteName = _commonUtils.QuoteSqlName(col2.Attribute.Name); - field.Append(_commonUtils.QuoteReadColumn(col.CsType, $"{tb2.Alias}.{quoteName}")); + field.Append(_commonUtils.QuoteReadColumn(col2.CsType, $"{tb2.Alias}.{quoteName}")); ++index; if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index); else dicfield.Add(quoteName, true); @@ -224,9 +267,13 @@ namespace FreeSql.Internal.CommonProvider { #region common protected TMember InternalAvg(Expression exp) => this.ToList($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault(); + async protected Task InternalAvgAsync(Expression exp) => (await this.ToListAsync($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault(); protected TMember InternalMax(Expression exp) => this.ToList($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault(); + async protected Task InternalMaxAsync(Expression exp) => (await this.ToListAsync($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault(); protected TMember InternalMin(Expression exp) => this.ToList($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault(); + async protected Task InternalMinAsync(Expression exp) => (await this.ToListAsync($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault(); protected TMember InternalSum(Expression exp) => this.ToList($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault(); + async protected Task InternalSumAsync(Expression exp) => (await this.ToListAsync($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})")).FirstOrDefault(); protected ISelectGrouping InternalGroupBy(Expression columns) { var map = new ReadAnonymousTypeInfo(); @@ -252,6 +299,7 @@ namespace FreeSql.Internal.CommonProvider { protected TSelect InternalOrderByDescending(Expression column) => this.OrderBy($"{_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, column, true, null)} DESC"); protected List InternalToList(Expression select) => this.ToListMapReader(this.GetNewExpressionField(select as NewExpression)); + protected Task> InternalToListAsync(Expression select) => this.ToListMapReaderAsync(this.GetNewExpressionField(select as NewExpression)); protected string InternalToSql(Expression select) => this.ToSql(this.GetNewExpressionField(select as NewExpression).field); protected TReturn InternalToAggregate(Expression select) { @@ -262,6 +310,14 @@ namespace FreeSql.Internal.CommonProvider { _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null); return this.ToListMapReader((map, map.Childs.Count > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); } + async protected Task InternalToAggregateAsync(Expression select) { + var map = new ReadAnonymousTypeInfo(); + var field = new StringBuilder(); + var index = 0; + + _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null); + return (await this.ToListMapReaderAsync((map, map.Childs.Count > 0 ? field.Remove(0, 2).ToString() : null))).FirstOrDefault(); + } protected TSelect InternalWhere(Expression exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index 53e6a57c..5b36e44b 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -22,22 +23,34 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index d29d1fb4..0579b1de 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -58,6 +59,8 @@ namespace FreeSql.Internal.CommonProvider { public TMember Avg(Expression> column) => this.InternalAvg(column?.Body); + public Task AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + public abstract ISelect From(Expression, T2, T3, ISelectFromExpression>> exp) where T2 : class where T3 : class;// { this.InternalFrom(exp?.Body); var ret = new Select3Provider(_orm, _commonUtils, _commonExpression, null); Select0Provider, T1>.CopyData(this, ret); return ret; } public abstract ISelect From(Expression, T2, T3, T4, ISelectFromExpression>> exp) where T2 : class where T3 : class where T4 : class;// { this.InternalFrom(exp?.Body); var ret = new Select4Provider(_orm, _commonUtils, _commonExpression, null); Select0Provider, T1>.CopyData(this, ret); return ret; } @@ -78,20 +81,30 @@ namespace FreeSql.Internal.CommonProvider { public TMember Max(Expression> column) => this.InternalMax(column?.Body); + public Task MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + public TMember Min(Expression> column) => this.InternalMin(column?.Body); + public Task MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + public ISelect OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); public ISelect OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); public TMember Sum(Expression> column) => this.InternalSum(column?.Body); + public Task SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + public List ToList(Expression> select) => this.InternalToList(select?.Body); + public Task> ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + public string ToSql(Expression> select) => this.InternalToSql(select?.Body); public TReturn ToAggregate(Expression, TReturn>> select) => this.InternalToAggregate(select?.Body); + public Task ToAggregateAsync(Expression, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + public ISelect Where(Expression> exp) => this.InternalWhere(exp?.Body); public ISelect Where(Expression> exp) where T2 : class => this.InternalWhere(exp?.Body); @@ -103,5 +116,7 @@ namespace FreeSql.Internal.CommonProvider { public ISelect Where(Expression> exp) where T2 : class where T3 : class where T4 : class where T5 : class => this.InternalWhere(exp?.Body); public ISelect WhereIf(bool condition, Expression> exp) => condition ? this.InternalWhere(exp?.Body) : this; + + } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index e5eeb366..53313f55 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -15,22 +16,34 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); - List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index be518a2a..18b61c25 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -16,26 +17,38 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; } -} +} \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index 7ded46be..4e3321da 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -17,26 +18,38 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; } -} +} \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index 9a11b8f4..429c5c8a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -18,22 +19,34 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 4133cfee..00544dd4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -19,22 +20,34 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index 4211d5c5..4370d3c9 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -1,18 +1,19 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract partial class Select8Provider : Select0Provider, T1>, ISelect - where T1 : class - where T2 : class - where T3 : class - where T4 : class - where T5 : class - where T6 : class - where T7 : class - where T8 : class { + abstract class Select8Provider : Select0Provider, T1>, ISelect + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + where T7 : class + where T8 : class { public Select8Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8)); @@ -20,22 +21,34 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 2e69af45..b349e495 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -1,19 +1,20 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { abstract class Select9Provider : Select0Provider, T1>, ISelect - where T1 : class - where T2 : class - where T3 : class - where T4 : class - where T5 : class - where T6 : class - where T7 : class - where T8 : class - where T9 : class { + where T1 : class + where T2 : class + where T3 : class + where T4 : class + where T5 : class + where T6 : class + where T7 : class + where T8 : class + where T9 : class { public Select9Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9)); @@ -21,26 +22,38 @@ namespace FreeSql.Internal.CommonProvider { TMember ISelect.Avg(Expression> column) => this.InternalAvg(column?.Body); + Task ISelect.AvgAsync(Expression> column) => this.InternalAvgAsync(column?.Body); + ISelectGrouping ISelect.GroupBy(Expression> exp) => this.InternalGroupBy(exp?.Body); TMember ISelect.Max(Expression> column) => this.InternalMax(column?.Body); + Task ISelect.MaxAsync(Expression> column) => this.InternalMaxAsync(column?.Body); + TMember ISelect.Min(Expression> column) => this.InternalMin(column?.Body); + Task ISelect.MinAsync(Expression> column) => this.InternalMinAsync(column?.Body); + ISelect ISelect.OrderBy(Expression> column) => this.InternalOrderBy(column?.Body); ISelect ISelect.OrderByDescending(Expression> column) => this.InternalOrderByDescending(column?.Body); TMember ISelect.Sum(Expression> column) => this.InternalSum(column?.Body); + Task ISelect.SumAsync(Expression> column) => this.InternalSumAsync(column?.Body); + TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregate(select?.Body); + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) => this.InternalToAggregateAsync(select?.Body); + List ISelect.ToList(Expression> select) => this.InternalToList(select?.Body); + Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); ISelect ISelect.WhereIf(bool condition, Expression> exp) => condition ? this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)) : this; } -} +} \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 6c4d074d..67c9f268 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { class SelectGroupingProvider : ISelectGrouping { @@ -58,6 +59,16 @@ namespace FreeSql.Internal.CommonProvider { method = method.MakeGenericMethod(typeof(TReturn)); return method.Invoke(_select, new object[] { (map, map.Childs.Count > 0 ? field.Remove(0, 2).ToString() : null) }) as List; } + public Task> ToListAsync(Expression, TReturn>> select) { + var map = new ReadAnonymousTypeInfo(); + var field = new StringBuilder(); + var index = 0; + + _comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString); + var method = _select.GetType().GetMethod("ToListMapReaderAsync", BindingFlags.Instance | BindingFlags.NonPublic); + method = method.MakeGenericMethod(typeof(TReturn)); + return method.Invoke(_select, new object[] { (map, map.Childs.Count > 0 ? field.Remove(0, 2).ToString() : null) }) as Task>; + } public string ToSql(Expression, TReturn>> select) { var map = new ReadAnonymousTypeInfo(); @@ -68,5 +79,7 @@ namespace FreeSql.Internal.CommonProvider { var method = _select.GetType().GetMethod("ToSql", new[] { typeof(string) }); return method.Invoke(_select, new object[] { map.Childs.Count > 0 ? field.Remove(0, 2).ToString() : null }) as string; } + + } } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 05d1a9e6..67b3b1f8 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -6,6 +6,7 @@ using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { @@ -30,12 +31,18 @@ namespace FreeSql.Internal.CommonProvider { if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(); } - public long ExecuteAffrows() { + public int ExecuteAffrows() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; return _orm.Ado.ExecuteNonQuery(CommandType.Text, sql, _params.Concat(_paramsSource).ToArray()); } + async public Task ExecuteAffrowsAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + return await _orm.Ado.ExecuteNonQueryAsync(CommandType.Text, sql, _params.Concat(_paramsSource).ToArray()); + } public abstract List ExecuteUpdated(); + public abstract Task> ExecuteUpdatedAsync(); public IUpdate IgnoreColumns(Expression> columns) { var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, columns?.Body, false, null).Distinct(); diff --git a/FreeSql/MySql/Curd/MySqlDelete.cs b/FreeSql/MySql/Curd/MySqlDelete.cs index 4990f3f9..66f49669 100644 --- a/FreeSql/MySql/Curd/MySqlDelete.cs +++ b/FreeSql/MySql/Curd/MySqlDelete.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Text; +using System.Threading.Tasks; namespace FreeSql.MySql.Curd { @@ -11,8 +12,11 @@ namespace FreeSql.MySql.Curd { } public override List ExecuteDeleted() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + var sb = new StringBuilder(); - sb.Append(this.ToSql()).Append(" RETURNING "); + sb.Append(sql).Append(" RETURNING "); var colidx = 0; foreach (var col in _table.Columns.Values) { @@ -22,5 +26,20 @@ namespace FreeSql.MySql.Curd { } return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params.ToArray()); } + async public override Task> ExecuteDeletedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(sql).Append(" RETURNING "); + + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params.ToArray()); + } } } diff --git a/FreeSql/MySql/Curd/MySqlInsert.cs b/FreeSql/MySql/Curd/MySqlInsert.cs index 21ba74b9..96a1a9cc 100644 --- a/FreeSql/MySql/Curd/MySqlInsert.cs +++ b/FreeSql/MySql/Curd/MySqlInsert.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Text; +using System.Threading.Tasks; namespace FreeSql.MySql.Curd { @@ -10,11 +11,25 @@ namespace FreeSql.MySql.Curd { : base(orm, commonUtils, commonExpression) { } - public override long ExecuteIdentity() => int.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, string.Concat(this.ToSql(), "; SELECT LAST_INSERT_ID();"), _params)), out var trylng) ? trylng : 0; + public override long ExecuteIdentity() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, string.Concat(sql, "; SELECT LAST_INSERT_ID();"), _params)), out var trylng) ? trylng : 0; + } + async public override Task ExecuteIdentityAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(CommandType.Text, string.Concat(sql, "; SELECT LAST_INSERT_ID();"), _params)), out var trylng) ? trylng : 0; + } public override List ExecuteInserted() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + var sb = new StringBuilder(); - sb.Append(this.ToSql()).Append(" RETURNING "); + sb.Append(sql).Append(" RETURNING "); var colidx = 0; foreach (var col in _table.Columns.Values) { @@ -24,5 +39,20 @@ namespace FreeSql.MySql.Curd { } return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params); } + async public override Task> ExecuteInsertedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(sql).Append(" RETURNING "); + + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params); + } } } diff --git a/FreeSql/MySql/Curd/MySqlUpdate.cs b/FreeSql/MySql/Curd/MySqlUpdate.cs index 8753bab0..d2e80615 100644 --- a/FreeSql/MySql/Curd/MySqlUpdate.cs +++ b/FreeSql/MySql/Curd/MySqlUpdate.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace FreeSql.MySql.Curd { @@ -14,8 +15,11 @@ namespace FreeSql.MySql.Curd { } public override List ExecuteUpdated() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + var sb = new StringBuilder(); - sb.Append(this.ToSql()).Append(" RETURNING "); + sb.Append(sql).Append(" RETURNING "); var colidx = 0; foreach (var col in _table.Columns.Values) { @@ -25,6 +29,21 @@ namespace FreeSql.MySql.Curd { } return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); } + async public override Task> ExecuteUpdatedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(sql).Append(" RETURNING "); + + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { if (_table.Primarys.Length == 1) { diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs b/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs index 48c2ba2f..30e91634 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs +++ b/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Text; +using System.Threading.Tasks; namespace FreeSql.PostgreSQL.Curd { @@ -11,8 +12,11 @@ namespace FreeSql.PostgreSQL.Curd { } public override List ExecuteDeleted() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + var sb = new StringBuilder(); - sb.Append(this.ToSql()).Append(" RETURNING "); + sb.Append(sql).Append(" RETURNING "); var colidx = 0; foreach (var col in _table.Columns.Values) { @@ -22,5 +26,20 @@ namespace FreeSql.PostgreSQL.Curd { } return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params.ToArray()); } + async public override Task> ExecuteDeletedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(sql).Append(" RETURNING "); + + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params.ToArray()); + } } } diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs b/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs index f0e08d91..37089eee 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs +++ b/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace FreeSql.PostgreSQL.Curd { @@ -11,12 +12,25 @@ namespace FreeSql.PostgreSQL.Curd { : base(orm, commonUtils, commonExpression) { } - public override long ExecuteIdentity() => - int.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, string.Concat(this.ToSql(), " RETURNING ", _commonUtils.QuoteSqlName(_table.Columns.Where(a => a.Value.Attribute.IsIdentity).FirstOrDefault().Value.Attribute.Name)), _params)), out var trylng) ? trylng : 0; + public override long ExecuteIdentity() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(_table.Columns.Where(a => a.Value.Attribute.IsIdentity).FirstOrDefault().Value.Attribute.Name)), _params)), out var trylng) ? trylng : 0; + } + async public override Task ExecuteIdentityAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(CommandType.Text, string.Concat(sql, " RETURNING ", _commonUtils.QuoteSqlName(_table.Columns.Where(a => a.Value.Attribute.IsIdentity).FirstOrDefault().Value.Attribute.Name)), _params)), out var trylng) ? trylng : 0; + } public override List ExecuteInserted() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + var sb = new StringBuilder(); - sb.Append(this.ToSql()).Append(" RETURNING "); + sb.Append(sql).Append(" RETURNING "); var colidx = 0; foreach (var col in _table.Columns.Values) { @@ -26,5 +40,20 @@ namespace FreeSql.PostgreSQL.Curd { } return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params); } + async public override Task> ExecuteInsertedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(sql).Append(" RETURNING "); + + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params); + } } } diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs b/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs index 4b592170..8ca3c124 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs +++ b/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace FreeSql.PostgreSQL.Curd { @@ -14,8 +15,11 @@ namespace FreeSql.PostgreSQL.Curd { } public override List ExecuteUpdated() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + var sb = new StringBuilder(); - sb.Append(this.ToSql()).Append(" RETURNING "); + sb.Append(sql).Append(" RETURNING "); var colidx = 0; foreach (var col in _table.Columns.Values) { @@ -25,6 +29,21 @@ namespace FreeSql.PostgreSQL.Curd { } return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); } + async public override Task> ExecuteUpdatedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(sql).Append(" RETURNING "); + + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { if (_table.Primarys.Length == 1) { diff --git a/FreeSql/SqlServer/Curd/SqlServerDelete.cs b/FreeSql/SqlServer/Curd/SqlServerDelete.cs index 61be5b7e..ac69a547 100644 --- a/FreeSql/SqlServer/Curd/SqlServerDelete.cs +++ b/FreeSql/SqlServer/Curd/SqlServerDelete.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Text; +using System.Threading.Tasks; namespace FreeSql.SqlServer.Curd { @@ -31,5 +32,25 @@ namespace FreeSql.SqlServer.Curd { return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params.ToArray()); } + async public override Task> ExecuteDeletedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(" OUTPUT "); + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append("DELETED.").Append(_commonUtils.QuoteReadColumn(col.CsType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + + var validx = sql.IndexOf(" WHERE "); + if (validx == -1) throw new ArgumentException("找不到 WHERE "); + sb.Insert(0, sql.Substring(0, validx)); + sb.Append(sql.Substring(validx)); + + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params.ToArray()); + } } } diff --git a/FreeSql/SqlServer/Curd/SqlServerInsert.cs b/FreeSql/SqlServer/Curd/SqlServerInsert.cs index 88efedb4..19960411 100644 --- a/FreeSql/SqlServer/Curd/SqlServerInsert.cs +++ b/FreeSql/SqlServer/Curd/SqlServerInsert.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Text; +using System.Threading.Tasks; namespace FreeSql.SqlServer.Curd { @@ -11,7 +12,18 @@ namespace FreeSql.SqlServer.Curd { : base(orm, commonUtils, commonExpression) { } - public override long ExecuteIdentity() => int.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, string.Concat(this.ToSql(), "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; + public override long ExecuteIdentity() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; + } + async public override Task ExecuteIdentityAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; + } public override List ExecuteInserted() { var sql = this.ToSql(); @@ -33,5 +45,25 @@ namespace FreeSql.SqlServer.Curd { return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params); } + async public override Task> ExecuteInsertedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(" OUTPUT "); + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + + var validx = sql.IndexOf(") VALUES"); + if (validx == -1) throw new ArgumentException("找不到 VALUES"); + sb.Insert(0, sql.Substring(0, validx + 1)); + sb.Append(sql.Substring(validx + 1)); + + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params); + } } } diff --git a/FreeSql/SqlServer/Curd/SqlServerUpdate.cs b/FreeSql/SqlServer/Curd/SqlServerUpdate.cs index 46ee6f7a..d1080863 100644 --- a/FreeSql/SqlServer/Curd/SqlServerUpdate.cs +++ b/FreeSql/SqlServer/Curd/SqlServerUpdate.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace FreeSql.SqlServer.Curd { @@ -34,6 +35,26 @@ namespace FreeSql.SqlServer.Curd { return _orm.Ado.Query(CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); } + async public override Task> ExecuteUpdatedAsync() { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + var sb = new StringBuilder(); + sb.Append(" OUTPUT "); + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + + var validx = sql.IndexOf(" WHERE "); + if (validx == -1) throw new ArgumentException("找不到 WHERE "); + sb.Insert(0, sql.Substring(0, validx)); + sb.Append(sql.Substring(validx)); + + return await _orm.Ado.QueryAsync(CommandType.Text, sb.ToString(), _params.Concat(_paramsSource).ToArray()); + } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { if (_table.Primarys.Length == 1) {