diff --git a/Examples/orm_vs_net40/Program.cs b/Examples/orm_vs_net40/Program.cs new file mode 100644 index 00000000..e3f572cb --- /dev/null +++ b/Examples/orm_vs_net40/Program.cs @@ -0,0 +1,261 @@ +//using SqlSugar; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace orm_vs +{ + class Program + { + static IFreeSql fsql = new FreeSql.FreeSqlBuilder() + //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=20") + .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=20") + .UseAutoSyncStructure(false) + .UseNoneCommandParameter(true) + //.UseConfigEntityFromDbFirst(true) + .Build(); + + //static SqlSugarClient sugar + //{ + // get => new SqlSugarClient(new ConnectionConfig() + // { + // //不欺负,让连接池100个最小 + // //ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=20;Max Pool Size=20", + // //DbType = DbType.SqlServer, + // ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20", + // DbType = DbType.MySql, + // IsAutoCloseConnection = true, + // InitKeyType = InitKeyType.Attribute + // }); + //} + + static void Main(string[] args) + { + var testlist1 = fsql.Select().OrderBy(a => a.Id).ToList(); + var testlist2 = new List(); + fsql.Select().OrderBy(a => a.Id).ToChunk(0, list => + { + testlist2.AddRange(list); + }); + + fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag)); + //sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag)); + //sugar创建表失败:SqlSugar.SqlSugarException: Sequence contains no elements + + //sugar.Aop.OnLogExecuted = (s, e) => + //{ + // Trace.WriteLine(s); + //}; + //测试前清空数据 + fsql.Delete().Where(a => a.Id > 0).ExecuteAffrows(); + //sugar.Deleteable().Where(a => a.Id > 0).ExecuteCommand(); + fsql.Ado.ExecuteNonQuery("delete from efcore_song"); + + var sb = new StringBuilder(); + Console.WriteLine("插入性能:"); + Insert(sb, 1000, 1); + Console.Write(sb.ToString()); + sb.Clear(); + Insert(sb, 1000, 10); + Console.Write(sb.ToString()); + sb.Clear(); + + Insert(sb, 1, 1000); + Console.Write(sb.ToString()); + sb.Clear(); + Insert(sb, 1, 10000); + Console.Write(sb.ToString()); + sb.Clear(); + Insert(sb, 1, 50000); + Console.Write(sb.ToString()); + sb.Clear(); + Insert(sb, 1, 100000); + Console.Write(sb.ToString()); + sb.Clear(); + + Console.WriteLine("查询性能:"); + Select(sb, 1000, 1); + Console.Write(sb.ToString()); + sb.Clear(); + Select(sb, 1000, 10); + Console.Write(sb.ToString()); + sb.Clear(); + + Select(sb, 1, 1000); + Console.Write(sb.ToString()); + sb.Clear(); + Select(sb, 1, 10000); + Console.Write(sb.ToString()); + sb.Clear(); + Select(sb, 1, 50000); + Console.Write(sb.ToString()); + sb.Clear(); + Select(sb, 1, 100000); + Console.Write(sb.ToString()); + sb.Clear(); + + Console.WriteLine("更新:"); + Update(sb, 1000, 1); + Console.Write(sb.ToString()); + sb.Clear(); + Update(sb, 1000, 10); + Console.Write(sb.ToString()); + sb.Clear(); + + Update(sb, 1, 1000); + Console.Write(sb.ToString()); + sb.Clear(); + Update(sb, 1, 10000); + Console.Write(sb.ToString()); + sb.Clear(); + Update(sb, 1, 50000); + Console.Write(sb.ToString()); + sb.Clear(); + Update(sb, 1, 100000); + Console.Write(sb.ToString()); + sb.Clear(); + + Console.WriteLine("测试结束,按任意键退出..."); + Console.ReadKey(); + } + + static void Select(StringBuilder sb, int forTime, int size) + { + Stopwatch sw = new Stopwatch(); + sw.Restart(); + for (var a = 0; a < forTime; a++) + fsql.Select().Limit(size).ToList(); + sw.Stop(); + sb.AppendLine($"FreeSql Select {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms"); + + //sw.Restart(); + //for (var a = 0; a < forTime; a++) + // sugar.Queryable().Take(size).ToList(); + //sw.Stop(); + //sb.AppendLine($"SqlSugar Select {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms"); + } + + static void Insert(StringBuilder sb, int forTime, int size) + { + var songs = Enumerable.Range(0, size).Select(a => new Song + { + Create_time = DateTime.Now, + Is_deleted = false, + Title = $"Insert_{a}", + Url = $"Url_{a}" + }); + + //预热 + fsql.Insert(songs.First()).ExecuteAffrows(); + //sugar.Insertable(songs.First()).ExecuteCommand(); + Stopwatch sw = new Stopwatch(); + + sw.Restart(); + for (var a = 0; a < forTime; a++) + { + fsql.Insert(songs).ExecuteAffrows(); + //using (var db = new FreeSongContext()) { + // //db.Configuration.AutoDetectChangesEnabled = false; + // db.Songs.AddRange(songs.ToArray()); + // db.SaveChanges(); + //} + } + sw.Stop(); + sb.AppendLine($"FreeSql Insert {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms"); + + //sw.Restart(); + //Exception sugarEx = null; + //try + //{ + // for (var a = 0; a < forTime; a++) + // sugar.Insertable(songs.ToArray()).ExecuteCommand(); + //} + //catch (Exception ex) + //{ + // sugarEx = ex; + //} + //sw.Stop(); + //sb.AppendLine($"SqlSugar Insert {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms" + (sugarEx != null ? $"成绩无效,错误:{sugarEx.Message}" : "")); + } + + static void Update(StringBuilder sb, int forTime, int size) + { + Stopwatch sw = new Stopwatch(); + + var songs = fsql.Select().Limit(size).ToList(); + sw.Restart(); + for (var a = 0; a < forTime; a++) + { + fsql.Update().SetSource(songs).ExecuteAffrows(); + } + sw.Stop(); + sb.AppendLine($"FreeSql Update {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms"); + + //songs = sugar.Queryable().Take(size).ToList(); + //sw.Restart(); + //Exception sugarEx = null; + //try + //{ + // for (var a = 0; a < forTime; a++) + // sugar.Updateable(songs).ExecuteCommand(); + //} + //catch (Exception ex) + //{ + // sugarEx = ex; + //} + //sw.Stop(); + //sb.AppendLine($"SqlSugar Update {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms" + (sugarEx != null ? $"成绩无效,错误:{sugarEx.Message}" : "")); + } + } + + [FreeSql.DataAnnotations.Table(Name = "freesql_song")] + //[SugarTable("sugar_song")] + public class Song + { + [FreeSql.DataAnnotations.Column(IsIdentity = true)] + //[SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + public DateTime? Create_time { get; set; } + public bool? Is_deleted { get; set; } + public string Title { get; set; } + public string Url { get; set; } + + //[SugarColumn(IsIgnore = true)] + public virtual ICollection Tags { get; set; } + } + [FreeSql.DataAnnotations.Table(Name = "freesql_song_tag")] + //[SugarTable("sugar_song_tag")] + public class Song_tag + { + public int Song_id { get; set; } + //[SugarColumn(IsIgnore = true)] + public virtual Song Song { get; set; } + + public int Tag_id { get; set; } + //[SugarColumn(IsIgnore = true)] + public virtual Tag Tag { get; set; } + } + [FreeSql.DataAnnotations.Table(Name = "freesql_tag")] + //[SugarTable("sugar_tag")] + public class Tag + { + [FreeSql.DataAnnotations.Column(IsIdentity = true)] + //[SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + public int? Parent_id { get; set; } + //[SugarColumn(IsIgnore = true)] + public virtual Tag Parent { get; set; } + + public decimal? Ddd { get; set; } + public string Name { get; set; } + + //[SugarColumn(IsIgnore = true)] + public virtual ICollection Songs { get; set; } + //[SugarColumn(IsIgnore = true)] + public virtual ICollection Tags { get; set; } + } +} diff --git a/Examples/orm_vs_net40/Properties/AssemblyInfo.cs b/Examples/orm_vs_net40/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..608091ec --- /dev/null +++ b/Examples/orm_vs_net40/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("orm_vs_net40")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("orm_vs_net40")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("1674bce3-eeb4-4003-a2a7-06f51efaea23")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/orm_vs_net40/orm_vs_net40.csproj b/Examples/orm_vs_net40/orm_vs_net40.csproj new file mode 100644 index 00000000..581a3ccb --- /dev/null +++ b/Examples/orm_vs_net40/orm_vs_net40.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23} + Exe + orm_vs_net40 + orm_vs_net40 + v4.0 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + {af9c50ec-6eb6-494b-9b3b-7edba6fd0ebb} + FreeSql + + + {28c6a39c-7ae7-4210-b7b0-0970216637a8} + FreeSql.Provider.MySql + + + {b61aac9e-59e9-4f47-bbe3-97ac24112efe} + FreeSql.Provider.SqlServer + + + + + 12.0.2 + + + + \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 952fb450..0180cb68 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin diff --git a/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs b/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs index e5593617..a8630d74 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs +++ b/Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs @@ -37,7 +37,7 @@ namespace FreeSql.Extensions that.Aop.ConfigEntityProperty += new EventHandler((s, e) => { - if (e.Property.GetCustomAttribute(false) != null) + if (e.Property.GetCustomAttributes(typeof(JsonMapAttribute), false).Any()) { e.ModifyResult.MapType = typeof(string); if (_dicTypes.TryAdd(e.Property.PropertyType, true)) diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index dd2434e2..ee3d60bf 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index f9d1d4f0..c9d86010 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -72,13 +72,13 @@ namespace FreeSql var props = _dicGetDbSetProps.GetOrAdd(this.GetType(), tp => tp.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) .Where(a => a.PropertyType.IsGenericType && - a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GenericTypeArguments[0])).ToArray()); + a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GetGenericArguments()[0])).ToArray()); foreach (var prop in props) { - var set = this.Set(prop.PropertyType.GenericTypeArguments[0]); + var set = this.Set(prop.PropertyType.GetGenericArguments()[0]); - prop.SetValue(this, set); + prop.SetValue(this, set, null); AllSets.Add(prop.Name, set); } } @@ -105,8 +105,6 @@ namespace FreeSql /// public void Add(TEntity data) where TEntity : class => this.Set().Add(data); public void AddRange(IEnumerable data) where TEntity : class => this.Set().AddRange(data); - public Task AddAsync(TEntity data) where TEntity : class => this.Set().AddAsync(data); - public Task AddRangeAsync(IEnumerable data) where TEntity : class => this.Set().AddRangeAsync(data); /// /// 更新 @@ -115,8 +113,6 @@ namespace FreeSql /// public void Update(TEntity data) where TEntity : class => this.Set().Update(data); public void UpdateRange(IEnumerable data) where TEntity : class => this.Set().UpdateRange(data); - public Task UpdateAsync(TEntity data) where TEntity : class => this.Set().UpdateAsync(data); - public Task UpdateRangeAsync(IEnumerable data) where TEntity : class => this.Set().UpdateRangeAsync(data); /// /// 删除 @@ -132,7 +128,6 @@ namespace FreeSql /// /// public void AddOrUpdate(TEntity data) where TEntity : class => this.Set().AddOrUpdate(data); - public Task AddOrUpdateAsync(TEntity data) where TEntity : class => this.Set().AddOrUpdateAsync(data); /// /// 附加实体,可用于不查询就更新或删除 @@ -152,6 +147,16 @@ namespace FreeSql this.Set().AttachOnlyPrimary(data); return this; } +#if net40 +#else + public Task AddAsync(TEntity data) where TEntity : class => this.Set().AddAsync(data); + public Task AddRangeAsync(IEnumerable data) where TEntity : class => this.Set().AddRangeAsync(data); + + public Task UpdateAsync(TEntity data) where TEntity : class => this.Set().UpdateAsync(data); + public Task UpdateRangeAsync(IEnumerable data) where TEntity : class => this.Set().UpdateRangeAsync(data); + + public Task AddOrUpdateAsync(TEntity data) where TEntity : class => this.Set().AddOrUpdateAsync(data); +#endif #endregion #region Queue Action diff --git a/FreeSql.DbContext/DbContext/DbContextAsync.cs b/FreeSql.DbContext/DbContext/DbContextAsync.cs index 61e6a258..4cac04a2 100644 --- a/FreeSql.DbContext/DbContext/DbContextAsync.cs +++ b/FreeSql.DbContext/DbContext/DbContextAsync.cs @@ -5,11 +5,12 @@ using System.Reflection; using System.Linq.Expressions; using System.Threading.Tasks; +#if net40 +#else namespace FreeSql { partial class DbContext { - async public virtual Task SaveChangesAsync() { await ExecCommandAsync(); @@ -133,3 +134,4 @@ namespace FreeSql } } } +#endif \ No newline at end of file diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 1696fe30..33f26e2a 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -8,11 +8,12 @@ using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; +#if net40 +#else namespace FreeSql { partial class DbSet { - Task DbContextExecCommandAsync() { _dicUpdateTimes.Clear(); @@ -409,3 +410,4 @@ namespace FreeSql #endregion } } +#endif \ No newline at end of file diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index a0aeddf1..35f8b091 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -169,11 +169,11 @@ namespace FreeSql var lazyFieldValue = (bool)lazyField.GetValue(item); if (lazyFieldValue == false) continue; } - propVal = prop.Value.GetValue(item); + propVal = prop.Value.GetValue(item, null); } else { - propVal = prop.Value.GetValue(item); + propVal = prop.Value.GetValue(item, null); if (propVal == null) continue; } diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 389c9c3a..002dc390 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin @@ -29,7 +29,10 @@ ns20;netstandard20 - + + net40 + + diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs index b09d7463..978a952b 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs @@ -79,10 +79,13 @@ namespace FreeSql ExecCommand(); return SaveChangesSuccess(); } +#if net40 +#else async public override Task SaveChangesAsync() { await ExecCommandAsync(); return SaveChangesSuccess(); } +#endif } } diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index ff43c3b1..723b545e 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql { - public abstract class BaseRepository : IBaseRepository + public abstract partial class BaseRepository : IBaseRepository where TEntity : class { @@ -78,35 +78,17 @@ namespace FreeSql _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); return affrows; } - async public Task DeleteAsync(Expression> predicate) - { - var delete = _dbset.OrmDeleteInternal(null).Where(predicate); - var sql = delete.ToSql(); - var affrows = await delete.ExecuteAffrowsAsync(); - _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); - return affrows; - } public int Delete(TEntity entity) { _dbset.Remove(entity); return _db.SaveChanges(); } - public Task DeleteAsync(TEntity entity) - { - _dbset.Remove(entity); - return _db.SaveChangesAsync(); - } public int Delete(IEnumerable entitys) { _dbset.RemoveRange(entitys); return _db.SaveChanges(); } - public Task DeleteAsync(IEnumerable entitys) - { - _dbset.RemoveRange(entitys); - return _db.SaveChangesAsync(); - } public virtual TEntity Insert(TEntity entity) { @@ -114,45 +96,23 @@ namespace FreeSql _db.SaveChanges(); return entity; } - async public virtual Task InsertAsync(TEntity entity) - { - await _dbset.AddAsync(entity); - _db.SaveChanges(); - return entity; - } public virtual List Insert(IEnumerable entitys) { _dbset.AddRange(entitys); _db.SaveChanges(); return entitys.ToList(); } - async public virtual Task> InsertAsync(IEnumerable entitys) - { - await _dbset.AddRangeAsync(entitys); - await _db.SaveChangesAsync(); - return entitys.ToList(); - } public int Update(TEntity entity) { _dbset.Update(entity); return _db.SaveChanges(); } - public Task UpdateAsync(TEntity entity) - { - _dbset.Update(entity); - return _db.SaveChangesAsync(); - } public int Update(IEnumerable entitys) { _dbset.UpdateRange(entitys); return _db.SaveChanges(); } - public Task UpdateAsync(IEnumerable entitys) - { - _dbset.UpdateRange(entitys); - return _db.SaveChangesAsync(); - } public void Attach(TEntity data) => _db.Attach(data); public void Attach(IEnumerable data) => _db.AttachRange(data); @@ -169,15 +129,9 @@ namespace FreeSql _db.SaveChanges(); return entity; } - async public Task InsertOrUpdateAsync(TEntity entity) - { - await _dbset.AddOrUpdateAsync(entity); - _db.SaveChanges(); - return entity; - } } - public abstract class BaseRepository : BaseRepository, IBaseRepository + public abstract partial class BaseRepository : BaseRepository, IBaseRepository where TEntity : class { @@ -198,12 +152,9 @@ namespace FreeSql } public int Delete(TKey id) => Delete(CheckTKeyAndReturnIdEntity(id)); - public Task DeleteAsync(TKey id) => DeleteAsync(CheckTKeyAndReturnIdEntity(id)); public TEntity Find(TKey id) => _dbset.OrmSelectInternal(CheckTKeyAndReturnIdEntity(id)).ToOne(); - public Task FindAsync(TKey id) => _dbset.OrmSelectInternal(CheckTKeyAndReturnIdEntity(id)).ToOneAsync(); public TEntity Get(TKey id) => Find(id); - public Task GetAsync(TKey id) => FindAsync(id); } } diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs b/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs new file mode 100644 index 00000000..0cfcba4d --- /dev/null +++ b/FreeSql.DbContext/Repository/Repository/BaseRepositoryAsync.cs @@ -0,0 +1,78 @@ +using FreeSql.Extensions.EntityUtil; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; + +#if net40 +#else +namespace FreeSql +{ + partial class BaseRepository + where TEntity : class + { + + async public Task DeleteAsync(Expression> predicate) + { + var delete = _dbset.OrmDeleteInternal(null).Where(predicate); + var sql = delete.ToSql(); + var affrows = await delete.ExecuteAffrowsAsync(); + _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); + return affrows; + } + + public Task DeleteAsync(TEntity entity) + { + _dbset.Remove(entity); + return _db.SaveChangesAsync(); + } + public Task DeleteAsync(IEnumerable entitys) + { + _dbset.RemoveRange(entitys); + return _db.SaveChangesAsync(); + } + + async public virtual Task InsertAsync(TEntity entity) + { + await _dbset.AddAsync(entity); + _db.SaveChanges(); + return entity; + } + async public virtual Task> InsertAsync(IEnumerable entitys) + { + await _dbset.AddRangeAsync(entitys); + await _db.SaveChangesAsync(); + return entitys.ToList(); + } + + public Task UpdateAsync(TEntity entity) + { + _dbset.Update(entity); + return _db.SaveChangesAsync(); + } + public Task UpdateAsync(IEnumerable entitys) + { + _dbset.UpdateRange(entitys); + return _db.SaveChangesAsync(); + } + + async public Task InsertOrUpdateAsync(TEntity entity) + { + await _dbset.AddOrUpdateAsync(entity); + _db.SaveChanges(); + return entity; + } + } + + partial class BaseRepository + { + + public Task DeleteAsync(TKey id) => DeleteAsync(CheckTKeyAndReturnIdEntity(id)); + + public Task FindAsync(TKey id) => _dbset.OrmSelectInternal(CheckTKeyAndReturnIdEntity(id)).ToOneAsync(); + + public Task GetAsync(TKey id) => FindAsync(id); + } +} +#endif \ No newline at end of file diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index effe252b..5ea1f28b 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -29,7 +29,10 @@ namespace FreeSql { int Delete(Expression> predicate); +#if net40 +#else Task DeleteAsync(Expression> predicate); +#endif } public interface IBaseRepository : IBaseRepository, IReadOnlyRepository, IBasicRepository diff --git a/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs b/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs index 5f2ba98a..6c56cd5c 100644 --- a/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs @@ -8,8 +8,6 @@ namespace FreeSql { TEntity Insert(TEntity entity); List Insert(IEnumerable entitys); - Task InsertAsync(TEntity entity); - Task> InsertAsync(IEnumerable entitys); /// /// 清空状态数据 @@ -29,18 +27,26 @@ namespace FreeSql int Update(TEntity entity); int Update(IEnumerable entitys); - Task UpdateAsync(TEntity entity); - Task UpdateAsync(IEnumerable entitys); TEntity InsertOrUpdate(TEntity entity); - Task InsertOrUpdateAsync(TEntity entity); IUpdate UpdateDiy { get; } int Delete(TEntity entity); int Delete(IEnumerable entitys); + +#if net40 +#else + Task InsertAsync(TEntity entity); + Task> InsertAsync(IEnumerable entitys); + + Task UpdateAsync(TEntity entity); + Task UpdateAsync(IEnumerable entitys); + Task InsertOrUpdateAsync(TEntity entity); + Task DeleteAsync(TEntity entity); Task DeleteAsync(IEnumerable entitys); +#endif } public interface IBasicRepository : IBasicRepository, IReadOnlyRepository @@ -48,7 +54,10 @@ namespace FreeSql { int Delete(TKey id); +#if net40 +#else Task DeleteAsync(TKey id); +#endif } } diff --git a/FreeSql.DbContext/Repository/Repository/IReadOnlyRepository.cs b/FreeSql.DbContext/Repository/Repository/IReadOnlyRepository.cs index 76728a9c..bd96458f 100644 --- a/FreeSql.DbContext/Repository/Repository/IReadOnlyRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IReadOnlyRepository.cs @@ -20,11 +20,12 @@ namespace FreeSql where TEntity : class { TEntity Get(TKey id); - - Task GetAsync(TKey id); - TEntity Find(TKey id); +#if net40 +#else + Task GetAsync(TKey id); Task FindAsync(TKey id); +#endif } } diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index c4e0ff11..c42182df 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table. diff --git a/FreeSql.sln b/FreeSql.sln index 1d8b4c4c..3464c254 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29324.140 MinimumVisualStudioVersion = 15.0.26124.0 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql", "FreeSql\FreeSql.csproj", "{AF9C50EC-6EB6-494B-9B3B-7EDBA6FD0EBB}" EndProject @@ -64,6 +64,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Odbc", "Pr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Odbc", "FreeSql.Tests\FreeSql.Tests.Provider.Odbc\FreeSql.Tests.Provider.Odbc.csproj", "{FA5667B9-BA85-4970-8818-BF09DD8DA3B4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "orm_vs_net40", "Examples\orm_vs_net40\orm_vs_net40.csproj", "{1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -374,6 +376,18 @@ Global {FA5667B9-BA85-4970-8818-BF09DD8DA3B4}.Release|x64.Build.0 = Release|Any CPU {FA5667B9-BA85-4970-8818-BF09DD8DA3B4}.Release|x86.ActiveCfg = Release|Any CPU {FA5667B9-BA85-4970-8818-BF09DD8DA3B4}.Release|x86.Build.0 = Release|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Debug|x64.ActiveCfg = Debug|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Debug|x64.Build.0 = Debug|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Debug|x86.ActiveCfg = Debug|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Debug|x86.Build.0 = Debug|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Release|Any CPU.Build.0 = Release|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Release|x64.ActiveCfg = Release|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Release|x64.Build.0 = Release|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Release|x86.ActiveCfg = Release|Any CPU + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -396,6 +410,7 @@ Global {FE0CB06E-493F-4CE8-B2D7-BF48CA8015C6} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} {3043DEF1-85DF-47AD-8D5D-327270794356} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} {C57444BA-8BF7-4790-A864-7F237123219B} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {1674BCE3-EEB4-4003-A2A7-06F51EFAEA23} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 071a0904..1d935c43 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -40,7 +40,7 @@ public static partial class FreeSqlGlobalExtensions public static bool IsNumberType(this Type that) => that == null ? false : dicIsNumberType.Value.ContainsKey(that); public static bool IsNullableType(this Type that) => that?.FullName.StartsWith("System.Nullable`1[") == true; public static bool IsAnonymousType(this Type that) => that?.FullName.StartsWith("<>f__AnonymousType") == true; - public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GenericTypeArguments.First() : that; + public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GetGenericArguments().First() : that; internal static string NotNullAndConcat(this string that, params object[] args) => string.IsNullOrEmpty(that) ? null : string.Concat(new object[] { that }.Concat(args)); /// @@ -64,15 +64,17 @@ public static partial class FreeSqlGlobalExtensions var value = dr.GetString(index); var t = typeof(T); var fs = _dicGetFields.GetOrAdd(t, t2 => t2.GetFields()); - foreach (var f in fs) - if (f.GetCustomAttribute()?.Description == value || f.Name == value) return Enum.Parse(t, f.Name, true); + foreach (var f in fs) { + var attr = f.GetCustomAttributes(typeof(DescriptionAttribute), false)?.FirstOrDefault() as DescriptionAttribute; + if (attr?.Description == value || f.Name == value) return Enum.Parse(t, f.Name, true); + } return null; } public static string ToDescriptionOrString(this Enum item) { string name = item.ToString(); - var desc = item.GetType().GetField(name)?.GetCustomAttribute(); + var desc = item.GetType().GetField(name)?.GetCustomAttributes(typeof(DescriptionAttribute), false)?.FirstOrDefault() as DescriptionAttribute; return desc?.Description ?? name; } public static long ToInt64(this Enum item) diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index b247f583..0f97b3ca 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin @@ -28,8 +28,12 @@ - + + + net40 + + diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 6179f8fa..003ef946 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2711,6 +2711,14 @@ + + + 插入数据,传入实体集合 + + + + + 修改数据 diff --git a/FreeSql/Interface/Curd/IDelete.cs b/FreeSql/Interface/Curd/IDelete.cs index b038153f..a9ba7831 100644 --- a/FreeSql/Interface/Curd/IDelete.cs +++ b/FreeSql/Interface/Curd/IDelete.cs @@ -84,12 +84,16 @@ namespace FreeSql /// /// int ExecuteAffrows(); - Task ExecuteAffrowsAsync(); /// /// 执行SQL语句,返回被删除的记录 /// /// List ExecuteDeleted(); + +#if net40 +#else + Task ExecuteAffrowsAsync(); Task> ExecuteDeletedAsync(); +#endif } } \ No newline at end of file diff --git a/FreeSql/Interface/Curd/IInsert.cs b/FreeSql/Interface/Curd/IInsert.cs index aa43198c..9a246642 100644 --- a/FreeSql/Interface/Curd/IInsert.cs +++ b/FreeSql/Interface/Curd/IInsert.cs @@ -88,18 +88,22 @@ namespace FreeSql /// /// int ExecuteAffrows(); - Task ExecuteAffrowsAsync(); /// /// 执行SQL语句,返回自增值 /// /// long ExecuteIdentity(); - Task ExecuteIdentityAsync(); /// /// 执行SQL语句,返回插入后的记录 /// /// List ExecuteInserted(); + +#if net40 +#else + Task ExecuteAffrowsAsync(); + Task ExecuteIdentityAsync(); Task> ExecuteInsertedAsync(); +#endif } } \ No newline at end of file diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index eb1773ba..e115fabf 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -8,9 +8,22 @@ using System.Threading.Tasks; namespace FreeSql { - public interface ISelect0 + public partial interface ISelect0 { +#if net40 +#else + Task ToDataTableAsync(string field = null); + Task> ToListAsync(bool includeNestedMembers = false); + Task> ToListAsync(string field); + + Task ToOneAsync(); + Task FirstAsync(); + + Task AnyAsync(); + Task CountAsync(); +#endif + /// /// 指定事务对象 /// @@ -36,7 +49,6 @@ namespace FreeSql /// /// DataTable ToDataTable(string field = null); - Task ToDataTableAsync(string field = null); /// /// 执行SQL查询,返回 T1 实体所有字段的记录,记录不存在时返回 Count 为 0 的列表 @@ -44,7 +56,6 @@ namespace FreeSql /// false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据 /// List ToList(bool includeNestedMembers = false); - Task> ToListAsync(bool includeNestedMembers = false); /// /// 执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。 /// @@ -59,20 +70,17 @@ namespace FreeSql /// /// List ToList(string field); - Task> ToListAsync(string field); /// /// 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null /// /// T1 ToOne(); - Task ToOneAsync(); /// /// 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null /// /// T1 First(); - Task FirstAsync(); /// /// 设置表名规则,可用于分库/分表,参数1:实体类型;参数2:默认表名;返回值:新表名; @@ -103,14 +111,12 @@ 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 8fc5e393..a5dc052c 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -9,20 +9,38 @@ namespace FreeSql public interface ISelect : ISelect0, T1>, ILinqToSql where T1 : class { +#if net40 +#else + Task AnyAsync(Expression> exp); + + Task ToDataTableAsync(Expression> select); + Task> ToListAsync(Expression> select); + Task> ToListAsync(); + + Task ToOneAsync(Expression> select); + Task ToOneAsync(); + Task FirstAsync(Expression> select); + Task FirstAsync(); + + Task ToAggregateAsync(Expression, TReturn>> select); + Task SumAsync(Expression> column); + Task MinAsync(Expression> column); + Task MaxAsync(Expression> column); + Task AvgAsync(Expression> column); +#endif + /// /// 执行SQL查询,是否有记录 /// /// lambda表达式 /// bool Any(Expression> exp); - Task AnyAsync(Expression> exp); /// /// 执行SQL查询,返回 DataTable /// /// DataTable ToDataTable(Expression> select); - Task ToDataTableAsync(Expression> select); /// /// 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 @@ -31,14 +49,12 @@ namespace FreeSql /// 选择列 /// List ToList(Expression> select); - Task> ToListAsync(Expression> select); /// /// 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Count 为 0 的列表 /// /// /// List ToList(); - Task> ToListAsync(); /// /// 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 @@ -47,14 +63,12 @@ namespace FreeSql /// 选择列 /// TReturn ToOne(Expression> select); - Task ToOneAsync(Expression> select); /// /// 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Dto 默认值 /// /// /// TDto ToOne(); - Task ToOneAsync(); /// /// 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 @@ -63,14 +77,12 @@ namespace FreeSql /// 选择列 /// TReturn First(Expression> select); - Task FirstAsync(Expression> select); /// /// 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Dto 默认值 /// /// /// TDto First(); - Task FirstAsync(); /// /// 返回即将执行的SQL语句 @@ -87,7 +99,6 @@ namespace FreeSql /// /// TReturn ToAggregate(Expression, TReturn>> select); - Task ToAggregateAsync(Expression, TReturn>> select); /// /// 求和 @@ -96,7 +107,6 @@ namespace FreeSql /// 列 /// TMember Sum(Expression> column); - Task SumAsync(Expression> column); /// /// 最小值 /// @@ -104,7 +114,6 @@ namespace FreeSql /// 列 /// TMember Min(Expression> column); - Task MinAsync(Expression> column); /// /// 最大值 /// @@ -112,7 +121,6 @@ namespace FreeSql /// 列 /// TMember Max(Expression> column); - Task MaxAsync(Expression> column); /// /// 平均值 /// @@ -120,7 +128,6 @@ 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 11cb5e76..83cc7949 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect10.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect10.cs @@ -9,29 +9,31 @@ 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 { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - 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); 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect2.cs b/FreeSql/Interface/Curd/ISelect/ISelect2.cs index 0b6c271b..98d24ad7 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect2.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect2.cs @@ -9,30 +9,31 @@ namespace FreeSql public interface ISelect : ISelect0, T1> where T1 : class where T2 : class { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - List ToList(Expression> select); Task> ToListAsync(Expression> select); - List ToList(); Task> ToListAsync(); - - string ToSql(Expression> select); - - TReturn ToAggregate(Expression, ISelectGroupingAggregate, TReturn>> select); Task ToAggregateAsync(Expression, 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect3.cs b/FreeSql/Interface/Curd/ISelect/ISelect3.cs index e890ca75..ee60a5b0 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect3.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect3.cs @@ -9,29 +9,31 @@ namespace FreeSql public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - List ToList(Expression> select); Task> ToListAsync(Expression> select); - List ToList(); Task> ToListAsync(); - 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect4.cs b/FreeSql/Interface/Curd/ISelect/ISelect4.cs index da0a140e..57640478 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect4.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect4.cs @@ -9,29 +9,31 @@ namespace FreeSql public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - List ToList(Expression> select); Task> ToListAsync(Expression> select); - List ToList(); Task> ToListAsync(); - 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect5.cs b/FreeSql/Interface/Curd/ISelect/ISelect5.cs index 28198dd0..3b94ff28 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect5.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect5.cs @@ -9,29 +9,31 @@ namespace FreeSql public interface ISelect : ISelect0, T1> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - 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); 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect6.cs b/FreeSql/Interface/Curd/ISelect/ISelect6.cs index 01a2b3ed..97c6c05c 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect6.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect6.cs @@ -9,29 +9,31 @@ 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 { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - 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); 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect7.cs b/FreeSql/Interface/Curd/ISelect/ISelect7.cs index ca2f6a82..80d7bc72 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect7.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect7.cs @@ -9,29 +9,31 @@ 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 { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - 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); 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect8.cs b/FreeSql/Interface/Curd/ISelect/ISelect8.cs index c77040b1..976ca71b 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect8.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect8.cs @@ -9,29 +9,31 @@ 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 { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - 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); 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect9.cs b/FreeSql/Interface/Curd/ISelect/ISelect9.cs index feba4958..0960ea22 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect9.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect9.cs @@ -9,29 +9,31 @@ 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 { - bool Any(Expression> exp); +#if net40 +#else Task AnyAsync(Expression> exp); - DataTable ToDataTable(Expression> select); Task ToDataTableAsync(Expression> select); - - 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); 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); +#endif + + bool Any(Expression> exp); + DataTable ToDataTable(Expression> select); + List ToList(Expression> select); + List ToList(); + string ToSql(Expression> select); + TReturn ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select); + TMember Sum(Expression> column); + TMember Min(Expression> column); + TMember Max(Expression> column); + TMember Avg(Expression> column); ISelect LeftJoin(Expression> exp); ISelect InnerJoin(Expression> exp); diff --git a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs index eac8339d..7cfb0f7e 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelectGrouping.cs @@ -8,6 +8,12 @@ namespace FreeSql { public interface ISelectGrouping { + +#if net40 +#else + Task> ToListAsync(Expression, TReturn>> select); +#endif + /// /// 按聚合条件过滤,Where(a => a.Count() > 10) /// @@ -36,7 +42,6 @@ namespace FreeSql /// 选择列 /// List ToList(Expression, TReturn>> select); - Task> ToListAsync(Expression, TReturn>> select); /// /// 【linq to sql】专用方法,不建议直接使用 diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs index 857b6169..ff023c78 100644 --- a/FreeSql/Interface/Curd/IUpdate.cs +++ b/FreeSql/Interface/Curd/IUpdate.cs @@ -153,12 +153,16 @@ namespace FreeSql /// /// int ExecuteAffrows(); - Task ExecuteAffrowsAsync(); /// /// 执行SQL语句,返回更新后的记录 /// /// List ExecuteUpdated(); + +#if net40 +#else + Task ExecuteAffrowsAsync(); Task> ExecuteUpdatedAsync(); +#endif } } \ No newline at end of file diff --git a/FreeSql/Interface/IAdo.cs b/FreeSql/Interface/IAdo.cs index a1d16be1..fd86d18c 100644 --- a/FreeSql/Interface/IAdo.cs +++ b/FreeSql/Interface/IAdo.cs @@ -219,6 +219,8 @@ namespace FreeSql (List, List, List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null); (List, List, List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); +#if net40 +#else #region async /// /// 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 @@ -389,5 +391,6 @@ namespace FreeSql Task<(List, List, List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null); Task<(List, List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); #endregion +#endif } } diff --git a/FreeSql/Interface/IFreeSql.cs b/FreeSql/Interface/IFreeSql.cs index 7910aa6a..f60fb182 100644 --- a/FreeSql/Interface/IFreeSql.cs +++ b/FreeSql/Interface/IFreeSql.cs @@ -33,6 +33,13 @@ public interface IFreeSql : IDisposable /// /// IInsert Insert(List source) where T1 : class; + /// + /// 插入数据,传入实体集合 + /// + /// + /// + /// + IInsert Insert(IEnumerable source) where T1 : class; /// /// 修改数据 diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 4fc329c6..bb2c63d0 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -617,7 +617,7 @@ namespace FreeSql.Internal var exp3tmpArg1Type = exp3tmpCall.Arguments.FirstOrDefault()?.Type; if (exp3tmpArg1Type != null) { - asSelectEntityType = exp3tmpArg1Type.GetElementType() ?? exp3tmpArg1Type.GenericTypeArguments.FirstOrDefault(); + asSelectEntityType = exp3tmpArg1Type.GetElementType() ?? exp3tmpArg1Type.GetGenericArguments().FirstOrDefault(); if (asSelectEntityType != null) { fsql = _dicExpressionLambdaToSqlAsSelectMethodInfo.GetOrAdd(asSelectEntityType, asSelectEntityType2 => typeof(IFreeSql).GetMethod("Select", new Type[0]).MakeGenericMethod(asSelectEntityType2)) @@ -1051,7 +1051,7 @@ namespace FreeSql.Internal case ExpressionType.MemberAccess: var exp2Type = exp2.Type; - if (exp2Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) exp2Type = exp2Type.GenericTypeArguments.LastOrDefault() ?? exp2.Type; + if (exp2Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) exp2Type = exp2Type.GetGenericArguments().LastOrDefault() ?? exp2.Type; var tb2tmp = _common.GetTableByEntity(exp2Type); var mp2 = exp2 as MemberExpression; if (mp2?.Member.Name == "Key" && mp2.Expression.Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`")) continue; diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index 4a672d94..a9b154ae 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -7,6 +7,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +#if net40 +#else namespace FreeSql.Internal.CommonProvider { partial class AdoProvider @@ -729,3 +731,4 @@ namespace FreeSql.Internal.CommonProvider } } } +#endif \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 45af15e9..a28e7a75 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -79,34 +79,7 @@ namespace FreeSql.Internal.CommonProvider this.ClearData(); return affrows; } - async public Task ExecuteAffrowsAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var affrows = 0; - Exception exception = null; - try - { - affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, affrows); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - this.ClearData(); - return affrows; - } public abstract List ExecuteDeleted(); - public abstract Task> ExecuteDeletedAsync(); public IDelete Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp?.Body, null)); public IDelete Where(string sql, object parms = null) diff --git a/FreeSql/Internal/CommonProvider/DeleteProviderAsync.cs b/FreeSql/Internal/CommonProvider/DeleteProviderAsync.cs new file mode 100644 index 00000000..9860c999 --- /dev/null +++ b/FreeSql/Internal/CommonProvider/DeleteProviderAsync.cs @@ -0,0 +1,45 @@ +using FreeSql.Internal.Model; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace FreeSql.Internal.CommonProvider +{ + partial class DeleteProvider + { +#if net40 +#else + async public Task ExecuteAffrowsAsync() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var affrows = 0; + Exception exception = null; + try + { + affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, affrows); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + this.ClearData(); + return affrows; + } + public abstract Task> ExecuteDeletedAsync(); +#endif + } +} diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index a6e65ed5..1130da06 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -224,57 +224,7 @@ namespace FreeSql.Internal.CommonProvider ClearData(); return ret; } - async protected Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) - { - var ss = SplitSource(valuesLimit, parameterLimit); - var ret = 0; - if (ss.Any() == false) - { - ClearData(); - return ret; - } - if (ss.Length == 1) - { - ret = await this.RawExecuteAffrowsAsync(); - ClearData(); - return ret; - } - if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); - if (_transaction != null) - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret += await this.RawExecuteAffrowsAsync(); - } - } - else - { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) - { - _transaction = conn.Value.BeginTransaction(); - try - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret += await this.RawExecuteAffrowsAsync(); - } - _transaction.Commit(); - } - catch - { - _transaction.Rollback(); - throw; - } - _transaction = null; - } - } - ClearData(); - return ret; - } protected long SplitExecuteIdentity(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); @@ -328,59 +278,7 @@ namespace FreeSql.Internal.CommonProvider ClearData(); return ret; } - async protected Task SplitExecuteIdentityAsync(int valuesLimit, int parameterLimit) - { - var ss = SplitSource(valuesLimit, parameterLimit); - long ret = 0; - if (ss.Any() == false) - { - ClearData(); - return ret; - } - if (ss.Length == 1) - { - ret = await this.RawExecuteIdentityAsync(); - ClearData(); - return ret; - } - if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); - if (_transaction != null) - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - if (a < ss.Length - 1) await this.RawExecuteAffrowsAsync(); - else ret = await this.RawExecuteIdentityAsync(); - } - } - else - { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) - { - _transaction = conn.Value.BeginTransaction(); - try - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - if (a < ss.Length - 1) await this.RawExecuteAffrowsAsync(); - else ret = await this.RawExecuteIdentityAsync(); - } - _transaction.Commit(); - } - catch - { - _transaction.Rollback(); - throw; - } - _transaction = null; - } - } - ClearData(); - return ret; - } protected List SplitExecuteInserted(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); @@ -432,57 +330,6 @@ namespace FreeSql.Internal.CommonProvider ClearData(); return ret; } - async protected Task> SplitExecuteInsertedAsync(int valuesLimit, int parameterLimit) - { - var ss = SplitSource(valuesLimit, parameterLimit); - var ret = new List(); - if (ss.Any() == false) - { - ClearData(); - return ret; - } - if (ss.Length == 1) - { - ret = await this.RawExecuteInsertedAsync(); - ClearData(); - return ret; - } - if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); - - if (_transaction != null) - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret.AddRange(await this.RawExecuteInsertedAsync()); - } - } - else - { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) - { - _transaction = conn.Value.BeginTransaction(); - try - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret.AddRange(await this.RawExecuteInsertedAsync()); - } - _transaction.Commit(); - } - catch - { - _transaction.Rollback(); - throw; - } - _transaction = null; - } - } - ClearData(); - return ret; - } #endregion protected int RawExecuteAffrows() @@ -508,40 +355,13 @@ namespace FreeSql.Internal.CommonProvider } return affrows; } - async protected Task RawExecuteAffrowsAsync() - { - var sql = ToSql(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - var affrows = 0; - Exception exception = null; - try - { - affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, affrows); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return affrows; - } + protected abstract long RawExecuteIdentity(); - protected abstract Task RawExecuteIdentityAsync(); protected abstract List RawExecuteInserted(); - protected abstract Task> RawExecuteInsertedAsync(); public abstract int ExecuteAffrows(); - public abstract Task ExecuteAffrowsAsync(); public abstract long ExecuteIdentity(); - public abstract Task ExecuteIdentityAsync(); public abstract List ExecuteInserted(); - public abstract Task> ExecuteInsertedAsync(); public IInsert IgnoreColumns(Expression> columns) { diff --git a/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs b/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs new file mode 100644 index 00000000..018cb81a --- /dev/null +++ b/FreeSql/Internal/CommonProvider/InsertProviderAsync.cs @@ -0,0 +1,210 @@ +using FreeSql.Internal.Model; +using SafeObjectPool; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace FreeSql.Internal.CommonProvider +{ + + partial class InsertProvider + { +#if net40 +#else + async protected Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) + { + var ss = SplitSource(valuesLimit, parameterLimit); + var ret = 0; + if (ss.Any() == false) + { + ClearData(); + return ret; + } + if (ss.Length == 1) + { + ret = await this.RawExecuteAffrowsAsync(); + ClearData(); + return ret; + } + if (_transaction == null) + this.WithTransaction(_orm.Ado.TransactionCurrentThread); + + if (_transaction != null) + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret += await this.RawExecuteAffrowsAsync(); + } + } + else + { + using (var conn = await _orm.Ado.MasterPool.GetAsync()) + { + _transaction = conn.Value.BeginTransaction(); + try + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret += await this.RawExecuteAffrowsAsync(); + } + _transaction.Commit(); + } + catch + { + _transaction.Rollback(); + throw; + } + _transaction = null; + } + } + ClearData(); + return ret; + } + + async protected Task SplitExecuteIdentityAsync(int valuesLimit, int parameterLimit) + { + var ss = SplitSource(valuesLimit, parameterLimit); + long ret = 0; + if (ss.Any() == false) + { + ClearData(); + return ret; + } + if (ss.Length == 1) + { + ret = await this.RawExecuteIdentityAsync(); + ClearData(); + return ret; + } + if (_transaction == null) + this.WithTransaction(_orm.Ado.TransactionCurrentThread); + + if (_transaction != null) + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + if (a < ss.Length - 1) await this.RawExecuteAffrowsAsync(); + else ret = await this.RawExecuteIdentityAsync(); + } + } + else + { + using (var conn = await _orm.Ado.MasterPool.GetAsync()) + { + _transaction = conn.Value.BeginTransaction(); + try + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + if (a < ss.Length - 1) await this.RawExecuteAffrowsAsync(); + else ret = await this.RawExecuteIdentityAsync(); + } + _transaction.Commit(); + } + catch + { + _transaction.Rollback(); + throw; + } + _transaction = null; + } + } + ClearData(); + return ret; + } + + async protected Task> SplitExecuteInsertedAsync(int valuesLimit, int parameterLimit) + { + var ss = SplitSource(valuesLimit, parameterLimit); + var ret = new List(); + if (ss.Any() == false) + { + ClearData(); + return ret; + } + if (ss.Length == 1) + { + ret = await this.RawExecuteInsertedAsync(); + ClearData(); + return ret; + } + if (_transaction == null) + this.WithTransaction(_orm.Ado.TransactionCurrentThread); + + if (_transaction != null) + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret.AddRange(await this.RawExecuteInsertedAsync()); + } + } + else + { + using (var conn = await _orm.Ado.MasterPool.GetAsync()) + { + _transaction = conn.Value.BeginTransaction(); + try + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret.AddRange(await this.RawExecuteInsertedAsync()); + } + _transaction.Commit(); + } + catch + { + _transaction.Rollback(); + throw; + } + _transaction = null; + } + } + ClearData(); + return ret; + } + + async protected Task RawExecuteAffrowsAsync() + { + var sql = ToSql(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + var affrows = 0; + Exception exception = null; + try + { + affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, affrows); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return affrows; + } + + protected abstract Task RawExecuteIdentityAsync(); + protected abstract Task> RawExecuteInsertedAsync(); + + public abstract Task ExecuteAffrowsAsync(); + public abstract Task ExecuteIdentityAsync(); + public abstract Task> ExecuteInsertedAsync(); +#endif + } +} + diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 2a1b90d3..93321ad1 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -15,7 +15,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - public abstract class Select0Provider : ISelect0 where TSelect : class where T1 : class + public abstract partial class Select0Provider : ISelect0 where TSelect : class where T1 : class { protected int _limit, _skip; @@ -130,14 +130,8 @@ 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 long Count() => this.ToList("count(1)").FirstOrDefault(); - async public Task CountAsync() => (await this.ToListAsync("count(1)")).FirstOrDefault(); public TSelect Count(out long count) { @@ -285,30 +279,6 @@ namespace FreeSql.Internal.CommonProvider } return ret; } - async public Task ToDataTableAsync(string field = null) - { - var sql = this.ToSql(field); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - DataTable ret = null; - Exception exception = null; - try - { - ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } public List ToList(string field) { @@ -340,37 +310,6 @@ namespace FreeSql.Internal.CommonProvider } return ret; } - async public Task> ToListAsync(string field) - { - var sql = this.ToSql(field); - var type = typeof(TTuple); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - var flagStr = $"ToListField:{field}"; - Exception exception = null; - try - { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => - { - var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); - ret.Add((TTuple)read.Value); - return Task.FromResult(false); - }, CommandType.Text, sql, dbParms); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } internal List ToListAfPrivate(string sql, GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) { var dbParms = _params.ToArray(); @@ -406,42 +345,6 @@ namespace FreeSql.Internal.CommonProvider _trackToList?.Invoke(ret); return ret; } - async internal Task> ToListAfPrivateAsync(string sql, GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) - { - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => - { - ret.Add(af.Read(_orm, dr)); - if (otherData != null) - { - var idx = af.FieldCount - 1; - foreach (var other in otherData) - other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false)); - } - return Task.FromResult(false); - }, CommandType.Text, sql, dbParms); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - foreach (var include in _includeToList) include?.Invoke(ret); - _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); - _trackToList?.Invoke(ret); - return ret; - } internal List ToListPrivate(GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) { string sql = null; @@ -457,21 +360,6 @@ namespace FreeSql.Internal.CommonProvider return ToListAfPrivate(sql, af, otherData); } - internal Task> ToListPrivateAsync(GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) - { - string sql = null; - if (otherData?.Length > 0) - { - var sbField = new StringBuilder().Append(af.Field); - foreach (var other in otherData) - sbField.Append(other.field); - sql = this.ToSql(sbField.ToString()); - } - else - sql = this.ToSql(af.Field); - - return ToListAfPrivateAsync(sql, af, otherData); - } #region ToChunk internal void ToListAfChunkPrivate(int chunkSize, Action> chunkDone, string sql, GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) { @@ -555,24 +443,13 @@ namespace FreeSql.Internal.CommonProvider if (_selectExpression != null) return this.InternalToList(_selectExpression); return this.ToListPrivate(includeNestedMembers == false ? this.GetAllFieldExpressionTreeLevel2() : this.GetAllFieldExpressionTreeLevelAll(), null); } - public virtual Task> ToListAsync(bool includeNestedMembers = false) - { - if (_selectExpression != null) return this.InternalToListAsync(_selectExpression); - return this.ToListPrivateAsync(includeNestedMembers == false ? this.GetAllFieldExpressionTreeLevel2() : this.GetAllFieldExpressionTreeLevelAll(), null); - } public T1 ToOne() { this.Limit(1); return this.ToList().FirstOrDefault(); } - async public Task ToOneAsync() - { - this.Limit(1); - return (await this.ToListAsync()).FirstOrDefault(); - } public T1 First() => this.ToOne(); - public Task FirstAsync() => this.ToOneAsync(); protected List ToListMapReader((ReadAnonymousTypeInfo map, string field) af) { @@ -605,38 +482,6 @@ namespace FreeSql.Internal.CommonProvider _trackToList?.Invoke(ret); return ret; } - async protected Task> ToListMapReaderAsync((ReadAnonymousTypeInfo map, string field) af) - { - var sql = this.ToSql(af.field); - var type = typeof(TReturn); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => - { - var index = -1; - ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false)); - return Task.FromResult(false); - }, CommandType.Text, sql, dbParms); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); - _trackToList?.Invoke(ret); - return ret; - } protected (ReadAnonymousTypeInfo map, string field) GetExpressionField(Expression newexp) { var map = new ReadAnonymousTypeInfo(); @@ -872,7 +717,7 @@ namespace FreeSql.Internal.CommonProvider else { var proptypeGeneric = prop.PropertyType; - if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); + if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GetGenericArguments().First(); if (proptypeGeneric.IsEnum || Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(Utils.RowInfo.Constructor, Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp)), @@ -1042,13 +887,9 @@ 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) { @@ -1077,7 +918,6 @@ 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.GetExpressionField(select)); - protected Task> InternalToListAsync(Expression select) => this.ToListMapReaderAsync(this.GetExpressionField(select)); protected string InternalToSql(Expression select) { var af = this.GetExpressionField(select); @@ -1108,6 +948,194 @@ namespace FreeSql.Internal.CommonProvider } return ret; } + + protected TReturn InternalToAggregate(Expression select) + { + var map = new ReadAnonymousTypeInfo(); + var field = new StringBuilder(); + var index = 0; + + _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression); + return this.ToListMapReader((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); + } + + protected TSelect InternalWhere(Expression exp) => exp == null ? this as TSelect : this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null, _whereCascadeExpression)); + #endregion + +#if net40 +#else + async public Task AnyAsync() + { + this.Limit(1); + return (await this.ToListAsync("1")).FirstOrDefault() == 1; + } + + async public Task CountAsync() => (await this.ToListAsync("count(1)")).FirstOrDefault(); + + async public Task ToDataTableAsync(string field = null) + { + var sql = this.ToSql(field); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + DataTable ret = null; + Exception exception = null; + try + { + ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } + + async public Task> ToListAsync(string field) + { + var sql = this.ToSql(field); + var type = typeof(TTuple); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + var flagStr = $"ToListField:{field}"; + Exception exception = null; + try + { + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => + { + var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); + ret.Add((TTuple)read.Value); + return Task.FromResult(false); + }, CommandType.Text, sql, dbParms); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } + + async internal Task> ToListAfPrivateAsync(string sql, GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) + { + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => + { + ret.Add(af.Read(_orm, dr)); + if (otherData != null) + { + var idx = af.FieldCount - 1; + foreach (var other in otherData) + other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false)); + } + return Task.FromResult(false); + }, CommandType.Text, sql, dbParms); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + foreach (var include in _includeToList) include?.Invoke(ret); + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); + _trackToList?.Invoke(ret); + return ret; + } + + internal Task> ToListPrivateAsync(GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) + { + string sql = null; + if (otherData?.Length > 0) + { + var sbField = new StringBuilder().Append(af.Field); + foreach (var other in otherData) + sbField.Append(other.field); + sql = this.ToSql(sbField.ToString()); + } + else + sql = this.ToSql(af.Field); + + return ToListAfPrivateAsync(sql, af, otherData); + } + + public virtual Task> ToListAsync(bool includeNestedMembers = false) + { + if (_selectExpression != null) return this.InternalToListAsync(_selectExpression); + return this.ToListPrivateAsync(includeNestedMembers == false ? this.GetAllFieldExpressionTreeLevel2() : this.GetAllFieldExpressionTreeLevelAll(), null); + } + + async public Task ToOneAsync() + { + this.Limit(1); + return (await this.ToListAsync()).FirstOrDefault(); + } + + public Task FirstAsync() => this.ToOneAsync(); + + async protected Task> ToListMapReaderAsync((ReadAnonymousTypeInfo map, string field) af) + { + var sql = this.ToSql(af.field); + var type = typeof(TReturn); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => + { + var index = -1; + ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false)); + return Task.FromResult(false); + }, CommandType.Text, sql, dbParms); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); + _trackToList?.Invoke(ret); + return ret; + } + + async protected Task InternalAvgAsync(Expression exp) => (await this.ToListAsync($"avg({_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(); + async protected Task InternalMinAsync(Expression exp) => (await this.ToListAsync($"min({_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 Task> InternalToListAsync(Expression select) => this.ToListMapReaderAsync(this.GetExpressionField(select)); + async protected Task InternalToDataTableAsync(Expression select) { var sql = this.InternalToSql(select); @@ -1133,15 +1161,6 @@ namespace FreeSql.Internal.CommonProvider return ret; } - protected TReturn InternalToAggregate(Expression select) - { - var map = new ReadAnonymousTypeInfo(); - var field = new StringBuilder(); - var index = 0; - - _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression); - return this.ToListMapReader((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null)).FirstOrDefault(); - } async protected Task InternalToAggregateAsync(Expression select) { var map = new ReadAnonymousTypeInfo(); @@ -1151,8 +1170,6 @@ namespace FreeSql.Internal.CommonProvider _commonExpression.ReadAnonymousField(_tables, field, map, ref index, select, null, _whereCascadeExpression); return (await this.ToListMapReaderAsync((map, field.Length > 0 ? field.Remove(0, 2).ToString() : null))).FirstOrDefault(); } - - protected TSelect InternalWhere(Expression exp) => exp == null ? this as TSelect : this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp, null, _whereCascadeExpression)); - #endregion +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index 8aec418b..372b46dc 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -42,13 +42,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -63,13 +56,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -77,13 +63,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -105,13 +84,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -119,27 +91,13 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -163,13 +121,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -219,11 +170,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 2a17fde4..ba3fdbe7 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -109,12 +109,6 @@ namespace FreeSql.Internal.CommonProvider _tables[0].Parameter = column.Parameters[0]; return this.InternalAvg(column?.Body); } - public Task AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - _tables[0].Parameter = column.Parameters[0]; - return this.InternalAvgAsync(column?.Body); - } public abstract ISelect From(Expression, T2, ISelectFromExpression>> exp) where T2 : class;// { this.InternalFrom(exp); var ret = new Select3Provider(_orm, _commonUtils, _commonExpression, null); Select0Provider, T1>.CopyData(this, ret, exp?.Parameters); return ret; } public abstract ISelect From(Expression, T2, T3, ISelectFromExpression>> exp) where T2 : class where T3 : class;// { this.InternalFrom(exp); var ret = new Select3Provider(_orm, _commonUtils, _commonExpression, null); Select0Provider, T1>.CopyData(this, ret, exp?.Parameters); return ret; } @@ -139,25 +133,12 @@ namespace FreeSql.Internal.CommonProvider _tables[0].Parameter = column.Parameters[0]; return this.InternalMax(column?.Body); } - public Task MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - _tables[0].Parameter = column.Parameters[0]; - return this.InternalMaxAsync(column?.Body); - } - public TMember Min(Expression> column) { if (column == null) return default(TMember); _tables[0].Parameter = column.Parameters[0]; return this.InternalMin(column?.Body); } - public Task MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - _tables[0].Parameter = column.Parameters[0]; - return this.InternalMinAsync(column?.Body); - } public ISelect OrderBy(Expression> column) => this.OrderBy(true, column); public ISelect OrderBy(bool condition, Expression> column) { @@ -179,12 +160,6 @@ namespace FreeSql.Internal.CommonProvider _tables[0].Parameter = column.Parameters[0]; return this.InternalSum(column?.Body); } - public Task SumAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - _tables[0].Parameter = column.Parameters[0]; - return this.InternalSumAsync(column?.Body); - } public List ToList(Expression> select) { @@ -192,14 +167,8 @@ 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); - } + public List ToList() => ToList(GetToListDtoSelector()); - public Task> ToListAsync() => ToListAsync(GetToListDtoSelector()); Expression> GetToListDtoSelector() { var ctor = typeof(TDto).GetConstructor(new Type[0]); @@ -254,9 +223,9 @@ namespace FreeSql.Internal.CommonProvider if (collectionSelector.Body.NodeType == ExpressionType.Call) { var callExp = collectionSelector.Body as MethodCallExpression; - if (callExp.Method.Name == "DefaultIfEmpty" && callExp.Object.Type.GenericTypeArguments.Any()) + if (callExp.Method.Name == "DefaultIfEmpty" && callExp.Object.Type.GetGenericArguments().Any()) { - find = _tables.Where((a, idx) => idx > 0 && a.Type == SelectTableInfoType.InnerJoin && a.Table.Type == callExp.Object.Type.GenericTypeArguments[0]).LastOrDefault(); + find = _tables.Where((a, idx) => idx > 0 && a.Type == SelectTableInfoType.InnerJoin && a.Table.Type == callExp.Object.Type.GetGenericArguments()[0]).LastOrDefault(); if (find != null) { if (!string.IsNullOrEmpty(find.On)) find.On = Regex.Replace(find.On, $@"\b{find.Alias}\.", $"{resultSelector.Parameters[1].Name}."); @@ -293,13 +262,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - public Task ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - _tables[0].Parameter = select.Parameters[0]; - return this.InternalToDataTableAsync(select?.Body); - } - public string ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -314,13 +276,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - public Task ToAggregateAsync(Expression, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - _tables[0].Parameter = select.Parameters[0]; - return this.InternalToAggregateAsync(select?.Body); - } - public ISelect Where(Expression> exp) => WhereIf(true, exp); public ISelect WhereIf(bool condition, Expression> exp) { @@ -372,20 +327,14 @@ namespace FreeSql.Internal.CommonProvider } public bool Any(Expression> exp) => this.Where(exp).Any(); - public Task AnyAsync(Expression> exp) => this.Where(exp).AnyAsync(); public TReturn ToOne(Expression> select) => this.Limit(1).ToList(select).FirstOrDefault(); - async public Task ToOneAsync(Expression> select) => (await this.Limit(1).ToListAsync(select)).FirstOrDefault(); public TDto ToOne() => this.Limit(1).ToList().FirstOrDefault(); - async public Task ToOneAsync() => (await this.Limit(1).ToListAsync()).FirstOrDefault(); public TReturn First(Expression> select) => this.ToOne(select); - public Task FirstAsync(Expression> select) => this.ToOneAsync(select); public TDto First() => this.ToOne(); - public Task FirstAsync() => this.ToOneAsync(); public override List ToList(bool includeNestedMembers = false) => base.ToList(_isIncluded || includeNestedMembers); - public override Task> ToListAsync(bool includeNestedMembers = false) => base.ToListAsync(_isIncluded || includeNestedMembers); bool _isIncluded = false; public ISelect Include(Expression> navigateSelector) where TNavigate : class @@ -963,5 +912,60 @@ namespace FreeSql.Internal.CommonProvider _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(list)); _trackToList?.Invoke(list); } + +#if net40 +#else + public Task AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + _tables[0].Parameter = column.Parameters[0]; + return this.InternalAvgAsync(column?.Body); + } + public Task MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + _tables[0].Parameter = column.Parameters[0]; + return this.InternalMaxAsync(column?.Body); + } + public Task MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + _tables[0].Parameter = column.Parameters[0]; + return this.InternalMinAsync(column?.Body); + } + public Task SumAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + _tables[0].Parameter = column.Parameters[0]; + return this.InternalSumAsync(column?.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); + } + public Task> ToListAsync() => ToListAsync(GetToListDtoSelector()); + + public Task ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + _tables[0].Parameter = select.Parameters[0]; + return this.InternalToDataTableAsync(select?.Body); + } + public Task ToAggregateAsync(Expression, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + _tables[0].Parameter = select.Parameters[0]; + return this.InternalToAggregateAsync(select?.Body); + } + + public Task AnyAsync(Expression> exp) => this.Where(exp).AnyAsync(); + async public Task ToOneAsync(Expression> select) => (await this.Limit(1).ToListAsync(select)).FirstOrDefault(); + async public Task ToOneAsync() => (await this.Limit(1).ToListAsync()).FirstOrDefault(); + public Task FirstAsync(Expression> select) => this.ToOneAsync(select); + public Task FirstAsync() => this.ToOneAsync(); + public override Task> ToListAsync(bool includeNestedMembers = false) => base.ToListAsync(_isIncluded || includeNestedMembers); +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs index 552f7660..1970e43c 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs @@ -26,13 +26,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -47,13 +40,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -61,13 +47,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -89,13 +68,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -103,27 +75,14 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -139,13 +98,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -195,11 +147,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index cd80bc19..641df438 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -28,13 +28,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -49,13 +42,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -63,13 +49,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -91,13 +70,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -105,27 +77,14 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -142,13 +101,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -198,11 +150,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index 707080a6..95b8195b 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -30,13 +30,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -51,13 +44,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -65,13 +51,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -93,13 +72,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -107,20 +79,14 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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]); @@ -131,13 +97,6 @@ namespace FreeSql.Internal.CommonProvider Expression.Parameter(typeof(T4), "d")); } - 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); - } - DataTable ISelect.ToDataTable(Expression> select) { if (select == null) return this.InternalToDataTable(select?.Body); @@ -145,13 +104,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -201,11 +153,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index 60a3c5e6..c78ce9be 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -32,13 +32,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -53,13 +46,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -67,13 +53,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -95,13 +74,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -109,27 +81,14 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -148,13 +107,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -204,11 +156,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index ee59440c..7a7a06be 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -34,13 +34,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -55,13 +48,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -69,13 +55,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -97,13 +76,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -111,27 +83,14 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -151,13 +110,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -207,11 +159,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 2118ee36..39fb0d10 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -36,13 +36,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -57,13 +50,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -71,13 +57,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -99,13 +78,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -113,27 +85,14 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -154,13 +113,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -210,11 +162,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index cc611d62..92c54153 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -38,13 +38,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -59,13 +52,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -73,13 +59,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -101,13 +80,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -115,27 +87,15 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -157,13 +117,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToDataTable(select?.Body); } - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -213,11 +166,64 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 3c3a8c1d..8db15de2 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -40,13 +40,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalAvg(column?.Body); } - Task ISelect.AvgAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalAvgAsync(column?.Body); - } - ISelectGrouping ISelect.GroupBy(Expression> exp) { if (exp == null) return this.InternalGroupBy(exp?.Body); @@ -61,13 +54,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMax(column?.Body); } - Task ISelect.MaxAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMaxAsync(column?.Body); - } - TMember ISelect.Min(Expression> column) { if (column == null) return default(TMember); @@ -75,13 +61,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalMin(column?.Body); } - Task ISelect.MinAsync(Expression> column) - { - if (column == null) return Task.FromResult(default(TMember)); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalMinAsync(column?.Body); - } - ISelect ISelect.OrderBy(Expression> column) { if (column == null) this.InternalOrderBy(column?.Body); @@ -103,13 +82,6 @@ namespace FreeSql.Internal.CommonProvider return this.InternalSum(column?.Body); } - Task ISelect.SumAsync(Expression> column) - { - if (column == null) this.InternalOrderBy(column?.Body); - for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; - return this.InternalSumAsync(column?.Body); - } - TReturn ISelect.ToAggregate(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) { if (select == null) return default(TReturn); @@ -117,27 +89,13 @@ namespace FreeSql.Internal.CommonProvider return this.InternalToAggregate(select?.Body); } - Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) - { - if (select == null) return Task.FromResult(default(TReturn)); - 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); } - 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]); @@ -159,14 +117,6 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; return this.InternalToDataTable(select?.Body); } - - Task ISelect.ToDataTableAsync(Expression> select) - { - if (select == null) return this.InternalToDataTableAsync(select?.Body); - for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; - return this.InternalToDataTableAsync(select?.Body); - } - string ISelect.ToSql(Expression> select) { if (select == null) return this.InternalToSql(select?.Body); @@ -180,14 +130,12 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } - ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.InternalJoin(exp?.Body, SelectTableInfoType.InnerJoin); } - ISelect ISelect.RightJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -201,7 +149,6 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)); } - ISelect ISelect.WhereIf(bool condition, Expression> exp) { if (condition == false || exp == null) return this; @@ -216,11 +163,65 @@ namespace FreeSql.Internal.CommonProvider return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).Any(); } +#if net40 +#else Task ISelect.AnyAsync(Expression> exp) { if (exp == null) return this.AnyAsync(); for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereCascadeExpression)).AnyAsync(); } + + Task ISelect.ToDataTableAsync(Expression> select) + { + if (select == null) return this.InternalToDataTableAsync(select?.Body); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToDataTableAsync(select?.Body); + } + + Task> ISelect.ToListAsync() => (this as ISelect).ToListAsync(GetToListDtoSelector()); + + Task ISelect.AvgAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalAvgAsync(column?.Body); + } + + Task ISelect.MaxAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMaxAsync(column?.Body); + } + + Task ISelect.MinAsync(Expression> column) + { + if (column == null) return Task.FromResult(default(TMember)); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalMinAsync(column?.Body); + } + + Task ISelect.SumAsync(Expression> column) + { + if (column == null) this.InternalOrderBy(column?.Body); + for (var a = 0; a < column.Parameters.Count; a++) _tables[a].Parameter = column.Parameters[a]; + return this.InternalSumAsync(column?.Body); + } + + Task ISelect.ToAggregateAsync(Expression, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, ISelectGroupingAggregate, TReturn>> select) + { + if (select == null) return Task.FromResult(default(TReturn)); + for (var a = 0; a < select.Parameters.Count; a++) _tables[a].Parameter = select.Parameters[a]; + return this.InternalToAggregateAsync(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); + } +#endif } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index cac92d53..4021b1d9 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -117,17 +117,7 @@ namespace FreeSql.Internal.CommonProvider method = method.MakeGenericMethod(typeof(TReturn)); return method.Invoke(_select, new object[] { (map, field.Length > 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, null); - var method = _select.GetType().GetMethod("ToListMapReaderAsync", BindingFlags.Instance | BindingFlags.NonPublic); - method = method.MakeGenericMethod(typeof(TReturn)); - return method.Invoke(_select, new object[] { (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as Task>; - } + public List Select(Expression, TReturn>> select) => ToList(select); public string ToSql(Expression, TReturn>> select) @@ -171,5 +161,20 @@ namespace FreeSql.Internal.CommonProvider method.Invoke(_select, new object[] { pageNumber, pageSize }); return this; } + +#if net40 +#else + 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, null); + var method = _select.GetType().GetMethod("ToListMapReaderAsync", BindingFlags.Instance | BindingFlags.NonPublic); + method = method.MakeGenericMethod(typeof(TReturn)); + return method.Invoke(_select, new object[] { (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null) }) as Task>; + } +#endif } } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 14709887..1cd348f8 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -180,52 +180,7 @@ namespace FreeSql.Internal.CommonProvider ClearData(); return ret; } - async protected Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) - { - var ss = SplitSource(valuesLimit, parameterLimit); - var ret = 0; - if (ss.Length <= 1) - { - ret = await this.RawExecuteAffrowsAsync(); - ClearData(); - return ret; - } - if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); - if (_transaction != null) - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret += await this.RawExecuteAffrowsAsync(); - } - } - else - { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) - { - _transaction = conn.Value.BeginTransaction(); - try - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret += await this.RawExecuteAffrowsAsync(); - } - _transaction.Commit(); - } - catch - { - _transaction.Rollback(); - throw; - } - _transaction = null; - } - } - ClearData(); - return ret; - } protected List SplitExecuteUpdated(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); @@ -272,52 +227,6 @@ namespace FreeSql.Internal.CommonProvider ClearData(); return ret; } - async protected Task> SplitExecuteUpdatedAsync(int valuesLimit, int parameterLimit) - { - var ss = SplitSource(valuesLimit, parameterLimit); - var ret = new List(); - if (ss.Length <= 1) - { - ret = await this.RawExecuteUpdatedAsync(); - ClearData(); - return ret; - } - if (_transaction == null) - this.WithTransaction(_orm.Ado.TransactionCurrentThread); - - if (_transaction != null) - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret.AddRange(await this.RawExecuteUpdatedAsync()); - } - } - else - { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) - { - _transaction = conn.Value.BeginTransaction(); - try - { - for (var a = 0; a < ss.Length; a++) - { - _source = ss[a]; - ret.AddRange(await this.RawExecuteUpdatedAsync()); - } - _transaction.Commit(); - } - catch - { - _transaction.Rollback(); - throw; - } - _transaction = null; - } - } - ClearData(); - return ret; - } #endregion protected int RawExecuteAffrows() @@ -346,39 +255,11 @@ namespace FreeSql.Internal.CommonProvider } return affrows; } - async protected Task RawExecuteAffrowsAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var affrows = 0; - Exception exception = null; - try - { - affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(affrows); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, affrows); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return affrows; - } + protected abstract List RawExecuteUpdated(); - protected abstract Task> RawExecuteUpdatedAsync(); public abstract int ExecuteAffrows(); - public abstract Task ExecuteAffrowsAsync(); public abstract List ExecuteUpdated(); - public abstract Task> ExecuteUpdatedAsync(); public IUpdate IgnoreColumns(Expression> columns) => IgnoreColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, columns?.Body, false, null)); public IUpdate UpdateColumns(Expression> columns) => UpdateColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, columns?.Body, false, null)); @@ -513,7 +394,7 @@ namespace FreeSql.Internal.CommonProvider { if (col.Column.Attribute.IsNullable == true && col.Column.Attribute.MapType.IsNullableType()) { - var replval = _orm.CodeFirst.GetDbInfo(col.Column.Attribute.MapType.GenericTypeArguments.FirstOrDefault())?.defaultValue; + var replval = _orm.CodeFirst.GetDbInfo(col.Column.Attribute.MapType.GetGenericArguments().FirstOrDefault())?.defaultValue; if (replval == null) continue; var replname = _commonUtils.QuoteSqlName(col.Column.Attribute.Name); expt = expt.Replace(replname, _commonUtils.IsNull(replname, _commonUtils.FormatSql("{0}", replval))); diff --git a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs new file mode 100644 index 00000000..5d2767f0 --- /dev/null +++ b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs @@ -0,0 +1,145 @@ +using FreeSql.Extensions.EntityUtil; +using FreeSql.Internal.Model; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace FreeSql.Internal.CommonProvider +{ + + partial class UpdateProvider + { +#if net40 +#else + async protected Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) + { + var ss = SplitSource(valuesLimit, parameterLimit); + var ret = 0; + if (ss.Length <= 1) + { + ret = await this.RawExecuteAffrowsAsync(); + ClearData(); + return ret; + } + if (_transaction == null) + this.WithTransaction(_orm.Ado.TransactionCurrentThread); + + if (_transaction != null) + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret += await this.RawExecuteAffrowsAsync(); + } + } + else + { + using (var conn = await _orm.Ado.MasterPool.GetAsync()) + { + _transaction = conn.Value.BeginTransaction(); + try + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret += await this.RawExecuteAffrowsAsync(); + } + _transaction.Commit(); + } + catch + { + _transaction.Rollback(); + throw; + } + _transaction = null; + } + } + ClearData(); + return ret; + } + async protected Task> SplitExecuteUpdatedAsync(int valuesLimit, int parameterLimit) + { + var ss = SplitSource(valuesLimit, parameterLimit); + var ret = new List(); + if (ss.Length <= 1) + { + ret = await this.RawExecuteUpdatedAsync(); + ClearData(); + return ret; + } + if (_transaction == null) + this.WithTransaction(_orm.Ado.TransactionCurrentThread); + + if (_transaction != null) + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret.AddRange(await this.RawExecuteUpdatedAsync()); + } + } + else + { + using (var conn = await _orm.Ado.MasterPool.GetAsync()) + { + _transaction = conn.Value.BeginTransaction(); + try + { + for (var a = 0; a < ss.Length; a++) + { + _source = ss[a]; + ret.AddRange(await this.RawExecuteUpdatedAsync()); + } + _transaction.Commit(); + } + catch + { + _transaction.Rollback(); + throw; + } + _transaction = null; + } + } + ClearData(); + return ret; + } + + async protected Task RawExecuteAffrowsAsync() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var affrows = 0; + Exception exception = null; + try + { + affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(affrows); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, affrows); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return affrows; + } + protected abstract Task> RawExecuteUpdatedAsync(); + + public abstract Task ExecuteAffrowsAsync(); + public abstract Task> ExecuteUpdatedAsync(); +#endif + } +} \ No newline at end of file diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index c19b4c28..656bd04a 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -272,7 +272,7 @@ namespace FreeSql.Internal if (table.Columns.TryGetValue(p.Name, out var trycol) == false) continue; if (psidx > 0) sb.Append(" AND "); sb.Append(aliasAndDot).Append(this.QuoteSqlName(trycol.Attribute.Name)); - sb.Append(this.FormatSql(" = {0}", Utils.GetDataReaderValue(trycol.Attribute.MapType, p.GetValue(dywhere)))); + sb.Append(this.FormatSql(" = {0}", Utils.GetDataReaderValue(trycol.Attribute.MapType, p.GetValue(dywhere, null)))); ++psidx; } if (psidx == 0) return ""; @@ -404,7 +404,7 @@ namespace FreeSql.Internal var initTasks = new Task[b]; for (var c = 0; c < b; c++) { - initTasks[c] = Task.Run(() => + initTasks[c] = Task.Factory.StartNew(() => { try { diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index cccb47c9..029d0518 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -152,7 +152,7 @@ namespace FreeSql.Internal trytb.ColumnsByCsIgnore.Add(p.Name, col); continue; } - if (entityDefault != null) colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(entityDefault); + if (entityDefault != null) colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(entityDefault, null); if (p.PropertyType.IsEnum) { var isEqualsEnumValue = false; @@ -170,7 +170,7 @@ namespace FreeSql.Internal if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue; if (colattr.IsNullable == false && colattr.DbDefautValue == null) { - var citype = colattr.MapType.IsNullableType() ? colattr.MapType.GenericTypeArguments.FirstOrDefault() : colattr.MapType; + var citype = colattr.MapType.IsNullableType() ? colattr.MapType.GetGenericArguments().FirstOrDefault() : colattr.MapType; if (citype.IsArray) colattr.DbDefautValue = Array.CreateInstance(citype, 0); else @@ -343,7 +343,7 @@ namespace FreeSql.Internal { throw new Exception($"【延时加载】{trytbTypeName} 编译错误:{ex.Message}\r\n\r\n{cscode}"); } - var type = assembly.DefinedTypes.Where(a => a.FullName.EndsWith(trytbTypeLazyName)).FirstOrDefault(); + var type = assembly.GetExportedTypes()/*.DefinedTypes*/.Where(a => a.FullName.EndsWith(trytbTypeLazyName)).FirstOrDefault(); trytb.TypeLazy = type; trytb.TypeLazySetOrm = type.GetProperty("__fsql_orm__", BindingFlags.Instance | BindingFlags.NonPublic).GetSetMethod(true); tbc.AddOrUpdate(type, trytb, (oldkey, oldval) => trytb); @@ -356,7 +356,7 @@ namespace FreeSql.Internal { var trytbTypeName = trytb.Type.IsNested ? $"{trytb.Type.DeclaringType.Namespace?.NotNullAndConcat(".")}{trytb.Type.DeclaringType.Name}.{trytb.Type.Name}" : $"{trytb.Type.Namespace?.NotNullAndConcat(".")}{trytb.Type.Name}"; var propTypeName = pnv.PropertyType.IsGenericType ? - $"{pnv.PropertyType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.Name.Remove(pnv.PropertyType.Name.IndexOf('`'))}<{string.Join(", ", pnv.PropertyType.GenericTypeArguments.Select(a => a.IsNested ? $"{a.DeclaringType.Namespace?.NotNullAndConcat(".")}{a.DeclaringType.Name}.{a.Name}" : $"{a.Namespace?.NotNullAndConcat(".")}{a.Name}"))}>" : + $"{pnv.PropertyType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.Name.Remove(pnv.PropertyType.Name.IndexOf('`'))}<{string.Join(", ", pnv.PropertyType.GetGenericArguments().Select(a => a.IsNested ? $"{a.DeclaringType.Namespace?.NotNullAndConcat(".")}{a.DeclaringType.Name}.{a.Name}" : $"{a.Namespace?.NotNullAndConcat(".")}{a.Name}"))}>" : (pnv.PropertyType.IsNested ? $"{pnv.PropertyType.DeclaringType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.DeclaringType.Name}.{pnv.PropertyType.Name}" : $"{pnv.PropertyType.Namespace?.NotNullAndConcat(".")}{pnv.PropertyType.Name}"); var pnvAttr = common.GetEntityNavigateAttribute(trytb.Type, pnv); @@ -365,7 +365,7 @@ namespace FreeSql.Internal nvref.Property = pnv; //List 或 ICollection,一对多、多对多 - var propElementType = pnv.PropertyType.GenericTypeArguments.FirstOrDefault() ?? pnv.PropertyType.GetElementType(); + var propElementType = pnv.PropertyType.GetGenericArguments().FirstOrDefault() ?? pnv.PropertyType.GetElementType(); if (propElementType != null) { if (typeof(IEnumerable).IsAssignableFrom(pnv.PropertyType) == false) return; @@ -398,7 +398,7 @@ namespace FreeSql.Internal if (pnvAttr?.ManyToMany != null) { isManyToMany = propElementType != trytb.Type && - tbref.Properties.Where(z => (z.Value.PropertyType.GenericTypeArguments.FirstOrDefault() == trytb.Type || z.Value.PropertyType.GetElementType() == trytb.Type) && + tbref.Properties.Where(z => (z.Value.PropertyType.GetGenericArguments().FirstOrDefault() == trytb.Type || z.Value.PropertyType.GetElementType() == trytb.Type) && common.GetEntityNavigateAttribute(tbref.Type, z.Value)?.ManyToMany == pnvAttr.ManyToMany && typeof(IEnumerable).IsAssignableFrom(z.Value.PropertyType)).Any(); @@ -419,7 +419,7 @@ namespace FreeSql.Internal { isManyToMany = propElementType != trytb.Type && pnv.Name.EndsWith($"{tbref.CsName}s", StringComparison.CurrentCultureIgnoreCase) && - tbref.Properties.Where(z => (z.Value.PropertyType.GenericTypeArguments.FirstOrDefault() == trytb.Type || z.Value.PropertyType.GetElementType() == trytb.Type) && + tbref.Properties.Where(z => (z.Value.PropertyType.GetGenericArguments().FirstOrDefault() == trytb.Type || z.Value.PropertyType.GetElementType() == trytb.Type) && z.Key.EndsWith($"{trytb.CsName}s", StringComparison.CurrentCultureIgnoreCase) && typeof(IEnumerable).IsAssignableFrom(z.Value.PropertyType)).Any(); } @@ -1025,7 +1025,7 @@ namespace FreeSql.Internal foreach (var p in ps) { if (string.IsNullOrEmpty(paramPrefix) == false && sql.IndexOf($"{paramPrefix}{p.Name}", StringComparison.CurrentCultureIgnoreCase) == -1) continue; - var pvalue = p.GetValue(obj); + var pvalue = p.GetValue(obj, null); if (p.PropertyType == ttype) ret.Add((T)Convert.ChangeType(pvalue, ttype)); else ret.Add(constructorParamter(p.Name, p.PropertyType, pvalue)); } @@ -1123,7 +1123,7 @@ namespace FreeSql.Internal ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile(); var typeGeneric = type; - if (typeGeneric.IsNullableType()) typeGeneric = type.GenericTypeArguments.First(); + if (typeGeneric.IsNullableType()) typeGeneric = type.GetGenericArguments().First(); if (typeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric)) return Expression.Lambda>( @@ -1156,7 +1156,7 @@ namespace FreeSql.Internal else { var fieldtypeGeneric = field.FieldType; - if (fieldtypeGeneric.IsNullableType()) fieldtypeGeneric = fieldtypeGeneric.GenericTypeArguments.First(); + if (fieldtypeGeneric.IsNullableType()) fieldtypeGeneric = fieldtypeGeneric.GetGenericArguments().First(); if (fieldtypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(fieldtypeGeneric)) read2ExpAssign = Expression.New(RowInfo.Constructor, GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)), @@ -1261,7 +1261,7 @@ namespace FreeSql.Internal else { var proptypeGeneric = readType; - if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); + if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GetGenericArguments().First(); if (proptypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) { @@ -1366,7 +1366,7 @@ namespace FreeSql.Internal else { var proptypeGeneric = readType; - if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GenericTypeArguments.First(); + if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GetGenericArguments().First(); if (proptypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) { @@ -1562,7 +1562,7 @@ namespace FreeSql.Internal ); } var typeOrg = type; - if (type.IsNullableType()) type = type.GenericTypeArguments.First(); + if (type.IsNullableType()) type = type.GetGenericArguments().First(); if (type.IsEnum) return Expression.Block( Expression.IfThenElse( diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs index f3679435..05dfc35d 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs @@ -53,6 +53,9 @@ namespace FreeSql.MySql.Curd this.ClearData(); return ret; } + +#if net40 +#else async public override Task> ExecuteDeletedAsync() { var sql = this.ToSql(); @@ -91,5 +94,6 @@ namespace FreeSql.MySql.Curd this.ClearData(); return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index 64f9a0c8..41b20ac4 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -16,11 +16,8 @@ namespace FreeSql.MySql.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(5000, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); public override long ExecuteIdentity() => base.SplitExecuteIdentity(5000, 3000); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); public override List ExecuteInserted() => base.SplitExecuteInserted(5000, 3000); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); protected override long RawExecuteIdentity() @@ -49,32 +46,6 @@ namespace FreeSql.MySql.Curd } return ret; } - async protected override Task RawExecuteIdentityAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - - sql = string.Concat(sql, "; SELECT LAST_INSERT_ID();"); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - long ret = 0; - Exception exception = null; - try - { - ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng) ? trylng : 0; - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override List RawExecuteInserted() { var sql = this.ToSql(); @@ -111,6 +82,39 @@ namespace FreeSql.MySql.Curd } return ret; } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); + + async protected override Task RawExecuteIdentityAsync() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + sql = string.Concat(sql, "; SELECT LAST_INSERT_ID();"); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + long ret = 0; + Exception exception = null; + try + { + ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out var trylng) ? trylng : 0; + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -147,5 +151,6 @@ namespace FreeSql.MySql.Curd } return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs index e3749b0a..dff4be5c 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs @@ -19,10 +19,7 @@ namespace FreeSql.MySql.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); public override List ExecuteUpdated() => base.SplitExecuteUpdated(500, 3000); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); - protected override List RawExecuteUpdated() { @@ -62,44 +59,6 @@ namespace FreeSql.MySql.Curd } return ret; } - async protected override Task> RawExecuteUpdatedAsync() - { - 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - sql = sb.ToString(); - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(ret.Count); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -136,5 +95,50 @@ namespace FreeSql.MySql.Curd } sb.Append(")"); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); + + async protected override Task> RawExecuteUpdatedAsync() + { + 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(ret.Count); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } +#endif } } diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 235f8835..a6913955 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net452 + netstandard2.0;net452;net451;net45;net40 0.10.14 true YeXiangQin @@ -21,13 +21,21 @@ - - - - + + + + + + + + + + net40 + + diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs index 35613bdd..e8bbc3fc 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs @@ -138,6 +138,8 @@ namespace FreeSql.MySql } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -165,6 +167,7 @@ namespace FreeSql.MySql } } } +#endif public void OnGetTimeout() { @@ -211,6 +214,9 @@ namespace FreeSql.MySql return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -225,5 +231,6 @@ namespace FreeSql.MySql return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index c718608b..e8c38cb0 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -58,7 +58,11 @@ namespace FreeSql.MySql if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var names = string.Join(",", Enum.GetNames(enumType).Select(a => _commonUtils.FormatSql("{0}", a))); diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index cb48f2a4..e91917f3 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -377,7 +377,7 @@ namespace FreeSql.MySql case "AddTicks": return $"date_add({left}, interval ({args1})/10 microsecond)"; case "AddYears": return $"date_add({left}, interval ({args1}) year)"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"timestampdiff(microsecond, {args1}, {left})"; case "System.TimeSpan": return $"date_sub({left}, interval ({args1}) microsecond)"; diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index cfaa492b..8617ef5e 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -43,6 +43,7 @@ namespace FreeSql.MySql public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new MySqlUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new MySqlUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new MySqlDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 43076597..852c0db1 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -37,5 +37,5 @@ - + diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcDelete.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcDelete.cs index 2d5168fa..cfc4663d 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcDelete.cs @@ -16,6 +16,10 @@ namespace FreeSql.Odbc.Default } public override List ExecuteDeleted() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); + +#if net40 +#else public override Task> ExecuteDeletedAsync() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcInsert.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcInsert.cs index f7c68d8f..be1e79d3 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcInsert.cs @@ -20,11 +20,8 @@ namespace FreeSql.Odbc.Default } public override int ExecuteAffrows() => base.SplitExecuteAffrows(_utils.Adapter.InsertBatchSplitLimit, 255); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(_utils.Adapter.InsertBatchSplitLimit, 255); public override long ExecuteIdentity() => base.SplitExecuteIdentity(_utils.Adapter.InsertBatchSplitLimit, 255); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(_utils.Adapter.InsertBatchSplitLimit, 255); public override List ExecuteInserted() => base.SplitExecuteInserted(_utils.Adapter.InsertBatchSplitLimit, 255); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(_utils.Adapter.InsertBatchSplitLimit, 255); protected override long RawExecuteIdentity() { @@ -63,6 +60,15 @@ namespace FreeSql.Odbc.Default } return ret; } + + protected override List RawExecuteInserted() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(_utils.Adapter.InsertBatchSplitLimit, 255); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(_utils.Adapter.InsertBatchSplitLimit, 255); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(_utils.Adapter.InsertBatchSplitLimit, 255); + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -100,8 +106,7 @@ namespace FreeSql.Odbc.Default } return ret; } - - protected override List RawExecuteInserted() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); protected override Task> RawExecuteInsertedAsync() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); +#endif } } \ No newline at end of file diff --git a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcUpdate.cs b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcUpdate.cs index f0c73c20..95cfc2fe 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/Curd/OdbcUpdate.cs @@ -20,12 +20,9 @@ namespace FreeSql.Odbc.Default } public override int ExecuteAffrows() => base.SplitExecuteAffrows(_utils.Adapter.InsertBatchSplitLimit, 255); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(_utils.Adapter.InsertBatchSplitLimit, 255); public override List ExecuteUpdated() => base.SplitExecuteUpdated(_utils.Adapter.InsertBatchSplitLimit, 255); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(_utils.Adapter.InsertBatchSplitLimit, 255); protected override List RawExecuteUpdated() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); - protected override Task> RawExecuteUpdatedAsync() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -60,5 +57,13 @@ namespace FreeSql.Odbc.Default ++pkidx; } } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(_utils.Adapter.InsertBatchSplitLimit, 255); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(_utils.Adapter.InsertBatchSplitLimit, 255); + + protected override Task> RawExecuteUpdatedAsync() => throw new NotImplementedException("FreeSql.Odbc.Default 未实现该功能"); +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs index dc8e581a..42d702a7 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs @@ -144,6 +144,8 @@ namespace FreeSql.Odbc.Default } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -172,6 +174,7 @@ namespace FreeSql.Odbc.Default } } } +#endif public void OnGetTimeout() { @@ -218,6 +221,9 @@ namespace FreeSql.Odbc.Default return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -232,5 +238,6 @@ namespace FreeSql.Odbc.Default return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcCodeFirst.cs index 9eee66a9..b007fb41 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcCodeFirst.cs @@ -66,7 +66,11 @@ namespace FreeSql.Odbc.Default if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs index 534bb1fa..50262556 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs @@ -356,7 +356,7 @@ namespace FreeSql.Odbc.Default case "AddTicks": return _utils.Adapter.LambdaDateTime_AddTicks(left, args1); case "AddYears": return _utils.Adapter.LambdaDateTime_AddYears(left, args1); case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return _utils.Adapter.LambdaDateTime_Subtract(left, args1); case "System.TimeSpan": return _utils.Adapter.LambdaDateTime_SubtractTimeSpan(left, args1); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs index 8dadf885..740fbfab 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcProvider.cs @@ -18,6 +18,7 @@ namespace FreeSql.Odbc.Default public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new OdbcUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new OdbcUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new OdbcDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index e47e6604..216b1b5b 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin @@ -29,6 +29,10 @@ - + + + net40 + + diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs index 84d7b968..e4daabfb 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs @@ -53,6 +53,9 @@ namespace FreeSql.Odbc.MySql this.ClearData(); return ret; } + +#if net40 +#else async public override Task> ExecuteDeletedAsync() { var sql = this.ToSql(); @@ -91,5 +94,6 @@ namespace FreeSql.Odbc.MySql this.ClearData(); return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs index cba7443d..72092283 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs @@ -18,11 +18,8 @@ namespace FreeSql.Odbc.MySql } public override int ExecuteAffrows() => base.SplitExecuteAffrows(5000, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); public override long ExecuteIdentity() => base.SplitExecuteIdentity(5000, 3000); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); public override List ExecuteInserted() => base.SplitExecuteInserted(5000, 3000); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); protected override long RawExecuteIdentity() @@ -62,43 +59,6 @@ namespace FreeSql.Odbc.MySql } return ret; } - async protected override Task RawExecuteIdentityAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - - Object poolConn = null; - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, string.Concat(sql, "; SELECT LAST_INSERT_ID();"), _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - long ret = 0; - Exception exception = null; - try - { - var conn = _connection; - if (_transaction != null) conn = _transaction.Connection; - if (conn == null) - { - poolConn = _orm.Ado.MasterPool.Get(); - conn = poolConn.Value; - } - await _orm.Ado.ExecuteNonQueryAsync(conn, _transaction, CommandType.Text, sql, _params); - ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(conn, _transaction, CommandType.Text, "SELECT LAST_INSERT_ID()")), out var trylng) ? trylng : 0; - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - if (poolConn != null) - _orm.Ado.MasterPool.Return(poolConn); - - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override List RawExecuteInserted() { var sql = this.ToSql(); @@ -135,6 +95,50 @@ namespace FreeSql.Odbc.MySql } return ret; } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); + + async protected override Task RawExecuteIdentityAsync() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + Object poolConn = null; + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, string.Concat(sql, "; SELECT LAST_INSERT_ID();"), _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + long ret = 0; + Exception exception = null; + try + { + var conn = _connection; + if (_transaction != null) conn = _transaction.Connection; + if (conn == null) + { + poolConn = _orm.Ado.MasterPool.Get(); + conn = poolConn.Value; + } + await _orm.Ado.ExecuteNonQueryAsync(conn, _transaction, CommandType.Text, sql, _params); + ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(conn, _transaction, CommandType.Text, "SELECT LAST_INSERT_ID()")), out var trylng) ? trylng : 0; + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + if (poolConn != null) + _orm.Ado.MasterPool.Return(poolConn); + + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -171,5 +175,6 @@ namespace FreeSql.Odbc.MySql } return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs index 35d854d3..4194f4f0 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs @@ -19,9 +19,7 @@ namespace FreeSql.Odbc.MySql } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); public override List ExecuteUpdated() => base.SplitExecuteUpdated(500, 3000); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); protected override List RawExecuteUpdated() @@ -62,44 +60,6 @@ namespace FreeSql.Odbc.MySql } return ret; } - async protected override Task> RawExecuteUpdatedAsync() - { - 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - sql = sb.ToString(); - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(ret.Count); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -136,5 +96,50 @@ namespace FreeSql.Odbc.MySql } sb.Append(")"); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); + + async protected override Task> RawExecuteUpdatedAsync() + { + 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(ret.Count); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs index 2996681b..9ad71a17 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs @@ -138,6 +138,8 @@ namespace FreeSql.Odbc.MySql } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -165,6 +167,7 @@ namespace FreeSql.Odbc.MySql } } } +#endif public void OnGetTimeout() { @@ -211,6 +214,9 @@ namespace FreeSql.Odbc.MySql return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -225,5 +231,6 @@ namespace FreeSql.Odbc.MySql return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs index 36b06ec7..1aeff28f 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs @@ -46,7 +46,11 @@ namespace FreeSql.Odbc.MySql if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var names = string.Join(",", Enum.GetNames(enumType).Select(a => _commonUtils.FormatSql("{0}", a))); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index cc27da38..ca13a287 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -377,7 +377,7 @@ namespace FreeSql.Odbc.MySql case "AddTicks": return $"date_add({left}, interval ({args1})/10 microsecond)"; case "AddYears": return $"date_add({left}, interval ({args1}) year)"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"timestampdiff(microsecond, {args1}, {left})"; case "System.TimeSpan": return $"date_sub({left}, interval ({args1}) microsecond)"; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs index f68bf0c8..ccc5830e 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlProvider.cs @@ -21,6 +21,7 @@ namespace FreeSql.Odbc.MySql public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new OdbcMySqlUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new OdbcMySqlUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new OdbcMySqlDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleDelete.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleDelete.cs index e042ef68..73085e57 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleDelete.cs @@ -19,9 +19,13 @@ namespace FreeSql.Odbc.Oracle { throw new NotImplementedException(); } + +#if net40 +#else public override Task> ExecuteDeletedAsync() { throw new NotImplementedException(); } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs index d74d87d2..0405c439 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs @@ -19,12 +19,8 @@ namespace FreeSql.Odbc.Oracle } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 999); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 999); public override long ExecuteIdentity() => base.SplitExecuteIdentity(500, 999); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(500, 999); public override List ExecuteInserted() => base.SplitExecuteInserted(500, 999); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(500, 999); - public override string ToSql() { @@ -137,6 +133,22 @@ namespace FreeSql.Odbc.Oracle } return ret; } + + protected override List RawExecuteInserted() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + this.RawExecuteAffrows(); + return _source; + } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 999); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(500, 999); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(500, 999); + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -190,15 +202,6 @@ namespace FreeSql.Odbc.Oracle } return ret; } - - protected override List RawExecuteInserted() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return new List(); - - this.RawExecuteAffrows(); - return _source; - } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -207,5 +210,6 @@ namespace FreeSql.Odbc.Oracle await this.RawExecuteAffrowsAsync(); return _source; } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleUpdate.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleUpdate.cs index 83fe3247..51e66622 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleUpdate.cs @@ -19,19 +19,13 @@ namespace FreeSql.Odbc.Oracle } public override int ExecuteAffrows() => base.SplitExecuteAffrows(200, 999); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999); public override List ExecuteUpdated() => base.SplitExecuteUpdated(200, 999); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); protected override List RawExecuteUpdated() { throw new NotImplementedException(); } - protected override Task> RawExecuteUpdatedAsync() - { - throw new NotImplementedException(); - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -68,5 +62,16 @@ namespace FreeSql.Odbc.Oracle } sb.Append(")"); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); + + protected override Task> RawExecuteUpdatedAsync() + { + throw new NotImplementedException(); + } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs index 533973d2..7ccfa7bd 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs @@ -155,6 +155,8 @@ namespace FreeSql.Odbc.Oracle } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -182,6 +184,7 @@ namespace FreeSql.Odbc.Oracle } } } +#endif public void OnGetTimeout() { @@ -228,6 +231,9 @@ namespace FreeSql.Odbc.Oracle return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -242,5 +248,6 @@ namespace FreeSql.Odbc.Oracle return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs index c1646775..84394be6 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs @@ -52,7 +52,11 @@ namespace FreeSql.Odbc.Oracle if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? @@ -90,7 +94,7 @@ namespace FreeSql.Odbc.Oracle var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //旧表名 if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] }; - var primaryKeyName = entityType.GetCustomAttribute()?.Name; + var primaryKeyName = (entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //创建数据库 throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}"); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index af0c5748..cd598adc 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -379,7 +379,7 @@ namespace FreeSql.Odbc.Oracle case "AddTicks": return $"({left}+({args1})/864000000000)"; case "AddYears": return $"add_months({left},({args1})*12)"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"numtodsinterval(({left}+0)-({args1}+0),'day')"; case "System.TimeSpan": return $"({left}-{args1})"; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs index 33004ad1..be0e4c11 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleProvider.cs @@ -16,6 +16,7 @@ namespace FreeSql.Odbc.Oracle public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new OdbcOracleUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new OdbcOracleUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new OdbcOracleDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLDelete.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLDelete.cs index a9039ebe..11250d19 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLDelete.cs @@ -53,6 +53,9 @@ namespace FreeSql.Odbc.PostgreSQL this.ClearData(); return ret; } + +#if net40 +#else async public override Task> ExecuteDeletedAsync() { var sql = this.ToSql(); @@ -91,5 +94,6 @@ namespace FreeSql.Odbc.PostgreSQL this.ClearData(); return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsert.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsert.cs index 430285a9..9ded50ef 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsert.cs @@ -17,12 +17,8 @@ namespace FreeSql.Odbc.PostgreSQL } public override int ExecuteAffrows() => base.SplitExecuteAffrows(5000, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); public override long ExecuteIdentity() => base.SplitExecuteIdentity(5000, 3000); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); public override List ExecuteInserted() => base.SplitExecuteInserted(5000, 3000); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); - protected override long RawExecuteIdentity() { @@ -73,6 +69,50 @@ namespace FreeSql.Odbc.PostgreSQL } return ret; } + + protected override List RawExecuteInserted() + { + 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + sql = sb.ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -122,43 +162,6 @@ namespace FreeSql.Odbc.PostgreSQL } return ret; } - - protected override List RawExecuteInserted() - { - 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - sql = sb.ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -195,5 +198,6 @@ namespace FreeSql.Odbc.PostgreSQL } return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs index 6aab35a3..8c13d6cf 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs @@ -19,10 +19,7 @@ namespace FreeSql.Odbc.PostgreSQL } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); public override List ExecuteUpdated() => base.SplitExecuteUpdated(500, 3000); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); - protected override List RawExecuteUpdated() { @@ -62,44 +59,6 @@ namespace FreeSql.Odbc.PostgreSQL } return ret; } - async protected override Task> RawExecuteUpdatedAsync() - { - 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - sql = sb.ToString(); - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(ret.Count); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -145,5 +104,50 @@ namespace FreeSql.Odbc.PostgreSQL sb.Append("::").Append(dbtype); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); + + async protected override Task> RawExecuteUpdatedAsync() + { + 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(ret.Count); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs index defc36a0..dfc21556 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs @@ -150,6 +150,8 @@ namespace FreeSql.Odbc.PostgreSQL } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -177,6 +179,7 @@ namespace FreeSql.Odbc.PostgreSQL } } } +#endif public void OnGetTimeout() { @@ -223,6 +226,9 @@ namespace FreeSql.Odbc.PostgreSQL return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -237,5 +243,6 @@ namespace FreeSql.Odbc.PostgreSQL return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs index 2d04cd90..964764a1 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs @@ -56,7 +56,11 @@ namespace FreeSql.Odbc.PostgreSQL if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (OdbcType, string, string, bool?, object)?((trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs index d610ba85..449c1a52 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs @@ -465,7 +465,7 @@ namespace FreeSql.Odbc.PostgreSQL case "AddTicks": return $"(({left})::timestamp+(({args1})/10||' microseconds')::interval)"; case "AddYears": return $"(({left})::timestamp+(({args1})||' year')::interval)"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"(extract(epoch from ({left})::timestamp-({args1})::timestamp)*1000000)"; case "System.TimeSpan": return $"(({left})::timestamp-(({args1})||' microseconds')::interval)"; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs index fb48307d..5313d309 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLProvider.cs @@ -19,6 +19,7 @@ namespace FreeSql.Odbc.PostgreSQL public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new OdbcPostgreSQLUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new OdbcPostgreSQLUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new OdbcPostgreSQLDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs index 1591c4c8..fc3143cb 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs @@ -47,13 +47,17 @@ namespace FreeSql.Odbc.PostgreSQL var elementType = type.GetElementType(); Type enumType = null; if (elementType.IsEnum) enumType = elementType; - else if (elementType.IsNullableType() && elementType.GenericTypeArguments.First().IsEnum) enumType = elementType.GenericTypeArguments.First(); + else if (elementType.IsNullableType()) + { + var genericTypesFirst = elementType.GetGenericArguments().First(); + if (genericTypesFirst.IsEnum) enumType = genericTypesFirst; + } if (enumType != null) return enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? getParamterArrayValue(typeof(long), value, elementType.IsEnum ? null : Enum.GetValues(enumType).GetValue(0)) : getParamterArrayValue(typeof(int), value, elementType.IsEnum ? null : Enum.GetValues(enumType).GetValue(0)); return dicGetParamterValue.TryGetValue(type.FullName, out var trydicarr) ? trydicarr(value) : value; } - if (type.IsNullableType()) type = type.GenericTypeArguments.First(); + if (type.IsNullableType()) type = type.GetGenericArguments().First(); if (type.IsEnum) return (int)value; if (dicGetParamterValue.TryGetValue(type.FullName, out var trydic)) return trydic(value); return value; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerDelete.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerDelete.cs index 6134d2a9..609591fa 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerDelete.cs @@ -58,6 +58,9 @@ namespace FreeSql.Odbc.SqlServer this.ClearData(); return ret; } + +#if net40 +#else async public override Task> ExecuteDeletedAsync() { var sql = this.ToSql(); @@ -101,5 +104,6 @@ namespace FreeSql.Odbc.SqlServer this.ClearData(); return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsert.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsert.cs index 986df69e..dcd41e7d 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsert.cs @@ -18,12 +18,8 @@ namespace FreeSql.Odbc.SqlServer } public override int ExecuteAffrows() => base.SplitExecuteAffrows(1000, 2100); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(1000, 2100); public override long ExecuteIdentity() => base.SplitExecuteIdentity(1000, 2100); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(1000, 2100); public override List ExecuteInserted() => base.SplitExecuteInserted(1000, 2100); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100); - protected override long RawExecuteIdentity() { @@ -51,32 +47,6 @@ namespace FreeSql.Odbc.SqlServer } return ret; } - async protected override Task RawExecuteIdentityAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - - sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - long ret = 0; - Exception exception = null; - try - { - long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out ret); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override List RawExecuteInserted() { @@ -119,6 +89,40 @@ namespace FreeSql.Odbc.SqlServer } return ret; } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(1000, 2100); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(1000, 2100); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100); + + + async protected override Task RawExecuteIdentityAsync() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + long ret = 0; + Exception exception = null; + try + { + long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out ret); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -160,5 +164,6 @@ namespace FreeSql.Odbc.SqlServer } return ret; } +#endif } } \ No newline at end of file diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerUpdate.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerUpdate.cs index bd0befb5..52155aad 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerUpdate.cs @@ -19,10 +19,7 @@ namespace FreeSql.Odbc.SqlServer } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 2100); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 2100); public override List ExecuteUpdated() => base.SplitExecuteUpdated(500, 2100); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 2100); - protected override List RawExecuteUpdated() { @@ -67,49 +64,6 @@ namespace FreeSql.Odbc.SqlServer } return ret; } - async protected override Task> RawExecuteUpdatedAsync() - { - 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.Attribute.MapType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - - var validx = sql.IndexOf(" \r\nWHERE "); - if (validx == -1) throw new ArgumentException("找不到 WHERE "); - sb.Insert(0, sql.Substring(0, validx)); - sb.Append(sql.Substring(validx)); - - sql = sb.ToString(); - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(ret.Count); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -144,5 +98,55 @@ namespace FreeSql.Odbc.SqlServer ++pkidx; } } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 2100); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 2100); + + async protected override Task> RawExecuteUpdatedAsync() + { + 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.Attribute.MapType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + + var validx = sql.IndexOf(" \r\nWHERE "); + if (validx == -1) throw new ArgumentException("找不到 WHERE "); + sb.Insert(0, sql.Substring(0, validx)); + sb.Append(sql.Substring(validx)); + + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(ret.Count); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs index ba1481d0..6a2516a6 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs @@ -144,6 +144,8 @@ namespace FreeSql.Odbc.SqlServer } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -172,6 +174,7 @@ namespace FreeSql.Odbc.SqlServer } } } +#endif public void OnGetTimeout() { @@ -218,6 +221,9 @@ namespace FreeSql.Odbc.SqlServer return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -232,5 +238,6 @@ namespace FreeSql.Odbc.SqlServer return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index 710d60e0..20416a9b 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -48,7 +48,11 @@ namespace FreeSql.Odbc.SqlServer if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index 6496196c..f96d7c83 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -359,7 +359,7 @@ namespace FreeSql.Odbc.SqlServer case "AddTicks": return $"dateadd(second, ({args1})/10000000, {left})"; case "AddYears": return $"dateadd(year, {args1}, {left})"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"datediff(second, {args1}, {left})"; case "System.TimeSpan": return $"dateadd(second, ({args1})*-1, {left})"; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs index 93e325ad..0f5c1203 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerProvider.cs @@ -15,6 +15,7 @@ namespace FreeSql.Odbc.SqlServer public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new OdbcSqlServerUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new OdbcSqlServerUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new OdbcSqlServerDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleDelete.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleDelete.cs index 3f6be169..8bd84136 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleDelete.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleDelete.cs @@ -19,9 +19,13 @@ namespace FreeSql.Oracle.Curd { throw new NotImplementedException(); } + +#if net40 +#else public override Task> ExecuteDeletedAsync() { throw new NotImplementedException(); } +#endif } } diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs index 03ab37b1..8585da3e 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs @@ -20,11 +20,8 @@ namespace FreeSql.Oracle.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 999); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 999); public override long ExecuteIdentity() => base.SplitExecuteIdentity(500, 999); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(500, 999); public override List ExecuteInserted() => base.SplitExecuteInserted(500, 999); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(500, 999); public override string ToSql() @@ -138,6 +135,21 @@ namespace FreeSql.Oracle.Curd } return ret; } + protected override List RawExecuteInserted() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + this.RawExecuteAffrows(); + return _source; + } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 999); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(500, 999); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(500, 999); + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -191,15 +203,6 @@ namespace FreeSql.Oracle.Curd } return ret; } - - protected override List RawExecuteInserted() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return new List(); - - this.RawExecuteAffrows(); - return _source; - } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -208,5 +211,6 @@ namespace FreeSql.Oracle.Curd await this.RawExecuteAffrowsAsync(); return _source; } +#endif } } diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs index 7338509f..57f85150 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs @@ -19,19 +19,13 @@ namespace FreeSql.Oracle.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(200, 999); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999); public override List ExecuteUpdated() => base.SplitExecuteUpdated(200, 999); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); protected override List RawExecuteUpdated() { throw new NotImplementedException(); } - protected override Task> RawExecuteUpdatedAsync() - { - throw new NotImplementedException(); - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -68,5 +62,16 @@ namespace FreeSql.Oracle.Curd } sb.Append(")"); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); + + protected override Task> RawExecuteUpdatedAsync() + { + throw new NotImplementedException(); + } +#endif } } diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index e8bf628b..d6a40e17 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin @@ -23,16 +23,20 @@ - + - - + + - + + + net40 + + diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs index 6f543c15..cf65eb94 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs @@ -155,6 +155,8 @@ namespace FreeSql.Oracle } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -182,6 +184,7 @@ namespace FreeSql.Oracle } } } +#endif public void OnGetTimeout() { @@ -228,6 +231,9 @@ namespace FreeSql.Oracle return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -242,5 +248,6 @@ namespace FreeSql.Oracle return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index 863b1cee..6ac27090 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -53,7 +53,11 @@ namespace FreeSql.Oracle if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? @@ -91,7 +95,7 @@ namespace FreeSql.Oracle var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //旧表名 if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] }; - var primaryKeyName = entityType.GetCustomAttribute()?.Name; + var primaryKeyName = (entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name; if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //创建数据库 throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}"); diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 8fab54c3..80016c64 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -379,7 +379,7 @@ namespace FreeSql.Oracle case "AddTicks": return $"({left}+({args1})/864000000000)"; case "AddYears": return $"add_months({left},({args1})*12)"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"numtodsinterval(({left}+0)-({args1}+0),'day')"; case "System.TimeSpan": return $"({left}-{args1})"; diff --git a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs index be867e3e..f425a362 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs @@ -17,6 +17,7 @@ namespace FreeSql.Oracle public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new OracleUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new OracleUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new OracleDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLDelete.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLDelete.cs index f2b40940..f5478a2e 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLDelete.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLDelete.cs @@ -53,6 +53,9 @@ namespace FreeSql.PostgreSQL.Curd this.ClearData(); return ret; } + +#if net40 +#else async public override Task> ExecuteDeletedAsync() { var sql = this.ToSql(); @@ -91,5 +94,6 @@ namespace FreeSql.PostgreSQL.Curd this.ClearData(); return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs index bb5ef651..af811633 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs @@ -17,12 +17,8 @@ namespace FreeSql.PostgreSQL.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(5000, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); public override long ExecuteIdentity() => base.SplitExecuteIdentity(5000, 3000); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); public override List ExecuteInserted() => base.SplitExecuteInserted(5000, 3000); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); - protected override long RawExecuteIdentity() { @@ -73,6 +69,50 @@ namespace FreeSql.PostgreSQL.Curd } return ret; } + + protected override List RawExecuteInserted() + { + 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + sql = sb.ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 3000); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 3000); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -122,43 +162,6 @@ namespace FreeSql.PostgreSQL.Curd } return ret; } - - protected override List RawExecuteInserted() - { - 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - sql = sb.ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = _orm.Ado.Query(_connection, _transaction, CommandType.Text, sql, _params); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -195,5 +198,6 @@ namespace FreeSql.PostgreSQL.Curd } return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs index 62343660..e56c125c 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs @@ -19,10 +19,7 @@ namespace FreeSql.PostgreSQL.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 3000); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); public override List ExecuteUpdated() => base.SplitExecuteUpdated(500, 3000); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); - protected override List RawExecuteUpdated() { @@ -62,44 +59,6 @@ namespace FreeSql.PostgreSQL.Curd } return ret; } - async protected override Task> RawExecuteUpdatedAsync() - { - 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - sql = sb.ToString(); - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(ret.Count); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -145,5 +104,50 @@ namespace FreeSql.PostgreSQL.Curd sb.Append("::").Append(dbtype); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 3000); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); + + async protected override Task> RawExecuteUpdatedAsync() + { + 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.Attribute.MapType, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(ret.Count); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } +#endif } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 7a1048ba..ef353458 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net461;net452;net451;net45 0.10.14 true YeXiangQin @@ -24,12 +24,18 @@ - - + + + + + + + + - + diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs index 74a2d707..d9694fbe 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs @@ -150,6 +150,8 @@ namespace FreeSql.PostgreSQL } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -177,6 +179,7 @@ namespace FreeSql.PostgreSQL } } } +#endif public void OnGetTimeout() { @@ -223,6 +226,9 @@ namespace FreeSql.PostgreSQL return false; } } + +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -237,5 +243,6 @@ namespace FreeSql.PostgreSQL return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs index ab1fb921..d3796ea2 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs @@ -1,5 +1,4 @@ -using Npgsql.LegacyPostgis; -using NpgsqlTypes; +using NpgsqlTypes; using System; using System.Collections; @@ -20,13 +19,15 @@ public static partial class PostgreSQLTypesExtensions return 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin((radLat1 - radLat2) / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin((radLng1 - radLng2) / 2), 2))) * 6378137; } +#if net40 +#else /// /// 测量两个经纬度的距离,返回单位:米 /// /// 经纬坐标1 /// 经纬坐标2 /// 返回距离(单位:米) - public static double Distance(this PostgisPoint that, PostgisPoint point) + public static double Distance(this Npgsql.LegacyPostgis.PostgisPoint that, Npgsql.LegacyPostgis.PostgisPoint point) { double radLat1 = (double)(that.Y) * Math.PI / 180d; double radLng1 = (double)(that.X) * Math.PI / 180d; @@ -34,6 +35,21 @@ public static partial class PostgreSQLTypesExtensions double radLng2 = (double)(point.X) * Math.PI / 180d; return 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin((radLat1 - radLat2) / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin((radLng1 - radLng2) / 2), 2))) * 6378137; } + + public static NpgsqlRange ToNpgsqlRange(this string that) + { + var s = that; + if (string.IsNullOrEmpty(s) || s == "empty") return NpgsqlRange.Empty; + string s1 = s.Trim('(', ')', '[', ']'); + string[] ss = s1.Split(new char[] { ',' }, 2); + if (ss.Length != 2) return NpgsqlRange.Empty; + T t1 = default(T); + T t2 = default(T); + if (!string.IsNullOrEmpty(ss[0])) t1 = (T)Convert.ChangeType(ss[0], typeof(T)); + if (!string.IsNullOrEmpty(ss[1])) t2 = (T)Convert.ChangeType(ss[1], typeof(T)); + return new NpgsqlRange(t1, s[0] == '[', s[0] == '(', t2, s[s.Length - 1] == ']', s[s.Length - 1] == ')'); + } +#endif public static string To1010(this BitArray ba) { @@ -54,18 +70,4 @@ public static partial class PostgreSQLTypesExtensions for (int a = 0; a < _1010Str.Length; a++) ret[a] = _1010Str[a] == '1'; return ret; } - - public static NpgsqlRange ToNpgsqlRange(this string that) - { - var s = that; - if (string.IsNullOrEmpty(s) || s == "empty") return NpgsqlRange.Empty; - string s1 = s.Trim('(', ')', '[', ']'); - string[] ss = s1.Split(new char[] { ',' }, 2); - if (ss.Length != 2) return NpgsqlRange.Empty; - T t1 = default(T); - T t2 = default(T); - if (!string.IsNullOrEmpty(ss[0])) t1 = (T)Convert.ChangeType(ss[0], typeof(T)); - if (!string.IsNullOrEmpty(ss[1])) t2 = (T)Convert.ChangeType(ss[1], typeof(T)); - return new NpgsqlRange(t1, s[0] == '[', s[0] == '(', t2, s[s.Length - 1] == ']', s[s.Length - 1] == ')'); - } } \ No newline at end of file diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index 83b31178..b781993f 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -70,6 +70,7 @@ namespace FreeSql.PostgreSQL public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new PostgreSQLUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new PostgreSQLUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new PostgreSQLDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerDelete.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerDelete.cs index df944cc1..8656d908 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerDelete.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerDelete.cs @@ -58,6 +58,9 @@ namespace FreeSql.SqlServer.Curd this.ClearData(); return ret; } + +#if net40 +#else async public override Task> ExecuteDeletedAsync() { var sql = this.ToSql(); @@ -101,5 +104,6 @@ namespace FreeSql.SqlServer.Curd this.ClearData(); return ret; } +#endif } } diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs index 46534b12..4c543635 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs @@ -18,12 +18,8 @@ namespace FreeSql.SqlServer.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(1000, 2100); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(1000, 2100); public override long ExecuteIdentity() => base.SplitExecuteIdentity(1000, 2100); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(1000, 2100); public override List ExecuteInserted() => base.SplitExecuteInserted(1000, 2100); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100); - protected override long RawExecuteIdentity() { @@ -51,33 +47,6 @@ namespace FreeSql.SqlServer.Curd } return ret; } - async protected override Task RawExecuteIdentityAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - - sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - long ret = 0; - Exception exception = null; - try - { - long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out ret); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } - protected override List RawExecuteInserted() { var sql = this.ToSql(); @@ -119,6 +88,39 @@ namespace FreeSql.SqlServer.Curd } return ret; } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(1000, 2100); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(1000, 2100); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100); + + async protected override Task RawExecuteIdentityAsync() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); + _orm.Aop.CurdBefore?.Invoke(this, before); + long ret = 0; + Exception exception = null; + try + { + long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_connection, _transaction, CommandType.Text, sql, _params)), out ret); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -160,5 +162,6 @@ namespace FreeSql.SqlServer.Curd } return ret; } +#endif } } \ No newline at end of file diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs index a8944a6c..e16c5dec 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs @@ -19,9 +19,7 @@ namespace FreeSql.SqlServer.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(500, 2100); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 2100); public override List ExecuteUpdated() => base.SplitExecuteUpdated(500, 2100); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 2100); protected override List RawExecuteUpdated() @@ -67,49 +65,6 @@ namespace FreeSql.SqlServer.Curd } return ret; } - async protected override Task> RawExecuteUpdatedAsync() - { - 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.Attribute.MapType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - - var validx = sql.IndexOf(" \r\nWHERE "); - if (validx == -1) throw new ArgumentException("找不到 WHERE "); - sb.Insert(0, sql.Substring(0, validx)); - sb.Append(sql.Substring(validx)); - - sql = sb.ToString(); - var dbParms = _params.Concat(_paramsSource).ToArray(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try - { - ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - ValidateVersionAndThrow(ret.Count); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -144,5 +99,55 @@ namespace FreeSql.SqlServer.Curd ++pkidx; } } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 2100); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 2100); + + async protected override Task> RawExecuteUpdatedAsync() + { + 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.Attribute.MapType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; + } + + var validx = sql.IndexOf(" \r\nWHERE "); + if (validx == -1) throw new ArgumentException("找不到 WHERE "); + sb.Insert(0, sql.Substring(0, validx)); + sb.Append(sql.Substring(validx)); + + sql = sb.ToString(); + var dbParms = _params.Concat(_paramsSource).ToArray(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try + { + ret = await _orm.Ado.QueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + ValidateVersionAndThrow(ret.Count); + } + catch (Exception ex) + { + exception = ex; + throw ex; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; + } +#endif } } diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 40b3048e..adb59a88 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net451 + netstandard2.0;net451;net45;net40 0.10.14 true YeXiangQin @@ -21,13 +21,17 @@ - - - - + + + + - + + + net40 + + diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs index e8412eb8..6911e681 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs @@ -143,7 +143,8 @@ namespace FreeSql.SqlServer } } } - +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -172,7 +173,7 @@ namespace FreeSql.SqlServer } } } - +#endif public void OnGetTimeout() { @@ -218,6 +219,8 @@ namespace FreeSql.SqlServer return false; } } +#if net40 +#else async public static Task PingAsync(this DbConnection that, bool isThrow = false) { try @@ -232,5 +235,6 @@ namespace FreeSql.SqlServer return false; } } +#endif } } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index 98954af7..d786528b 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -51,7 +51,11 @@ namespace FreeSql.SqlServer if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index ce835798..4b0b0bb1 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -359,7 +359,7 @@ namespace FreeSql.SqlServer case "AddTicks": return $"dateadd(second, ({args1})/10000000, {left})"; case "AddYears": return $"dateadd(year, {args1}, {left})"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"datediff(second, {args1}, {left})"; case "System.TimeSpan": return $"dateadd(second, ({args1})*-1, {left})"; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs index 33017c8e..467f7c96 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs @@ -16,6 +16,7 @@ namespace FreeSql.SqlServer public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new SqlServerUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new SqlServerUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new SqlServerDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteDelete.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteDelete.cs index f582cb6b..d71498cf 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteDelete.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteDelete.cs @@ -19,9 +19,13 @@ namespace FreeSql.Sqlite.Curd { throw new NotImplementedException(); } + +#if net40 +#else public override Task> ExecuteDeletedAsync() { throw new NotImplementedException(); } +#endif } } diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs index 8c09083b..034aeabb 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs @@ -17,12 +17,8 @@ namespace FreeSql.Sqlite.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(5000, 999); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 999); public override long ExecuteIdentity() => base.SplitExecuteIdentity(5000, 999); - public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 999); public override List ExecuteInserted() => base.SplitExecuteInserted(5000, 999); - public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 999); - protected override long RawExecuteIdentity() { @@ -50,6 +46,22 @@ namespace FreeSql.Sqlite.Curd } return ret; } + + protected override List RawExecuteInserted() + { + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); + + this.RawExecuteAffrows(); + return _source; + } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(5000, 999); + public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(5000, 999); + public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 999); + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); @@ -76,14 +88,6 @@ namespace FreeSql.Sqlite.Curd } return ret; } - protected override List RawExecuteInserted() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return new List(); - - this.RawExecuteAffrows(); - return _source; - } async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); @@ -92,5 +96,6 @@ namespace FreeSql.Sqlite.Curd await this.RawExecuteAffrowsAsync(); return _source; } +#endif } } diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs index a7a568a4..92e9bdc2 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs @@ -19,19 +19,13 @@ namespace FreeSql.Sqlite.Curd } public override int ExecuteAffrows() => base.SplitExecuteAffrows(200, 999); - public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999); public override List ExecuteUpdated() => base.SplitExecuteUpdated(200, 999); - public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); protected override List RawExecuteUpdated() { throw new NotImplementedException(); } - protected override Task> RawExecuteUpdatedAsync() - { - throw new NotImplementedException(); - } protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { @@ -68,5 +62,16 @@ namespace FreeSql.Sqlite.Curd } sb.Append(")"); } + +#if net40 +#else + public override Task ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999); + public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); + + protected override Task> RawExecuteUpdatedAsync() + { + throw new NotImplementedException(); + } +#endif } } diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index bd6e239f..289dfeb0 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0;net45;net40 0.10.14 true YeXiangQin @@ -30,4 +30,8 @@ + + net40 + + diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs index 8f53eb91..f5f200f8 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs @@ -150,6 +150,8 @@ namespace FreeSql.Sqlite } } +#if net40 +#else async public Task OnGetAsync(Object obj) { @@ -177,6 +179,7 @@ namespace FreeSql.Sqlite } } } +#endif public void OnGetTimeout() { @@ -222,21 +225,6 @@ namespace FreeSql.Sqlite return false; } } - async public static Task PingAsync(this DbConnection that, bool isThrow = false) - { - try - { - await PingCommand(that).ExecuteNonQueryAsync(); - return true; - } - catch - { - if (that.State != ConnectionState.Closed) try { that.Close(); } catch { } - if (isThrow) throw; - return false; - } - } - public static void OpenAndAttach(this DbConnection that, string[] attach) { that.Open(); @@ -252,6 +240,23 @@ namespace FreeSql.Sqlite cmd.ExecuteNonQuery(); } } + +#if net40 +#else + async public static Task PingAsync(this DbConnection that, bool isThrow = false) + { + try + { + await PingCommand(that).ExecuteNonQueryAsync(); + return true; + } + catch + { + if (that.State != ConnectionState.Closed) try { that.Close(); } catch { } + if (isThrow) throw; + return false; + } + } async public static Task OpenAndAttachAsync(this DbConnection that, string[] attach) { await that.OpenAsync(); @@ -267,5 +272,6 @@ namespace FreeSql.Sqlite await cmd.ExecuteNonQueryAsync(); } } +#endif } } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs index 9d804e0c..68639935 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs @@ -50,7 +50,11 @@ namespace FreeSql.Sqlite if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new (int, string, string, bool?, object)?(((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue)); if (type.IsArray) return null; var enumType = type.IsEnum ? type : null; - if (enumType == null && type.IsNullableType() && type.GenericTypeArguments.Length == 1 && type.GenericTypeArguments.First().IsEnum) enumType = type.GenericTypeArguments.First(); + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 4967e2d8..9f451e0b 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -381,7 +381,7 @@ namespace FreeSql.Sqlite case "AddTicks": return $"datetime({left},(({args1})/10000000)||' seconds')"; case "AddYears": return $"datetime({left},({args1})||' years')"; case "Subtract": - switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GenericTypeArguments.FirstOrDefault() : exp.Arguments[0].Type).FullName) + switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName) { case "System.DateTime": return $"(strftime('%s',{left})-strftime('%s',{args1}))"; case "System.TimeSpan": return $"datetime({left},(({args1})*-1)||' seconds')"; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs index 6cb3524e..ef67538b 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs @@ -17,6 +17,7 @@ namespace FreeSql.Sqlite public IInsert Insert(T1 source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => this.Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => this.Insert().AppendData(source); + public IInsert Insert(IEnumerable source) where T1 : class => this.Insert().AppendData(source); public IUpdate Update() where T1 : class => new SqliteUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public IUpdate Update(object dywhere) where T1 : class => new SqliteUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public IDelete Delete() where T1 : class => new SqliteDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, null); diff --git a/readme.md b/readme.md index 3007ce80..fafa5822 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@

-FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.5+(QQ群:4336577) +FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.0+(QQ群:4336577) 扶摇直上,至强ORM只为自由编码;鹏程万里,至简Linq可使保留黑发;横批:FreeSql(诗人:Coder) @@ -53,14 +53,15 @@ FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore | Package Name | Version | |--------------| ------- | -| FreeSql.Provider.MySql | NETStandard2.0、net452 | +| FreeSql.Provider.MySql | NETStandard2.0、net45、net40 | +| FreeSql.Provider.MySqlConnector | NETStandard2.0、net45 | | FreeSql.Provider.PostgreSQL | NETStandard2.0、net45 | -| FreeSql.Provider.SqlServer | NETStandard2.0、net451 | -| FreeSql.Provider.Sqlite | NETStandard2.0、net45 | -| FreeSql.Provider.Oracle | NETStandard2.0、net45 | -| [FreeSql.Provider.Odbc](https://github.com/2881099/FreeSql/tree/master/Providers/FreeSql.Provider.Odbc) | NETStandard2.0、net45 | -| FreeSql.Extensions.LazyLoading | NETStandard2.0、net45 | -| FreeSql.Extensions.JsonMap | NETStandard2.0、net45 | +| FreeSql.Provider.SqlServer | NETStandard2.0、net45、net40 | +| FreeSql.Provider.Sqlite | NETStandard2.0、net45、net40 | +| FreeSql.Provider.Oracle | NETStandard2.0、net45、net40 | +| [FreeSql.Provider.Odbc](https://github.com/2881099/FreeSql/tree/master/Providers/FreeSql.Provider.Odbc) | NETStandard2.0、net45、net40 | +| FreeSql.Extensions.LazyLoading | NETStandard2.0、net45、net40 | +| FreeSql.Extensions.JsonMap | NETStandard2.0、net45、net40 | | FreeSql.Extensions.BaseEntity | NETStandard2.0 |