using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace FreeSql { public abstract class BaseRepository : IRepository where TEntity : class { protected IFreeSql _fsql; public BaseRepository(IFreeSql fsql) : base() { _fsql = fsql; if (_fsql == null) throw new NullReferenceException("fsql 参数不可为空"); } public ISelect Select => _fsql.Select(); public IUpdate UpdateDiy => _fsql.Update(); public int Delete(Expression> predicate) => _fsql.Delete().Where(predicate).ExecuteAffrows(); public int Delete(TEntity entity) => _fsql.Delete(entity).ExecuteAffrows(); public Task DeleteAsync(Expression> predicate) => _fsql.Delete().Where(predicate).ExecuteAffrowsAsync(); public Task DeleteAsync(TEntity entity) => _fsql.Delete(entity).ExecuteAffrowsAsync(); public virtual TEntity Insert(TEntity entity) { switch (_fsql.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: return _fsql.Insert().AppendData(entity).ExecuteInserted().FirstOrDefault(); case DataType.MySql: case DataType.Oracle: case DataType.Sqlite: default: throw new NotImplementedException($"{_fsql.Ado.DataType}不支持类似returning或output类型的特性,请参考FreeSql插入数据的方法重新现实。"); } } public virtual List Insert(IEnumerable entity) { switch (_fsql.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: return _fsql.Insert().AppendData(entity).ExecuteInserted(); case DataType.MySql: case DataType.Oracle: case DataType.Sqlite: default: throw new NotImplementedException($"{_fsql.Ado.DataType}不支持类似returning或output类型的特性,请参考FreeSql插入数据的方法重新现实。"); } } async public virtual Task InsertAsync(TEntity entity) { switch (_fsql.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: return (await _fsql.Insert().AppendData(entity).ExecuteInsertedAsync()).FirstOrDefault(); case DataType.MySql: case DataType.Oracle: case DataType.Sqlite: default: throw new NotImplementedException($"{_fsql.Ado.DataType}不支持类似returning或output类型的特性,请参考FreeSql插入数据的方法重新现实。"); } } public virtual Task> InsertAsync(IEnumerable entity) { switch (_fsql.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: return _fsql.Insert().AppendData(entity).ExecuteInsertedAsync(); case DataType.MySql: case DataType.Oracle: case DataType.Sqlite: default: throw new NotImplementedException($"{_fsql.Ado.DataType}不支持类似returning或output类型的特性,请参考FreeSql插入数据的方法重新现实。"); } } public int Update(TEntity entity) => _fsql.Update().SetSource(entity).ExecuteAffrows(); public Task UpdateAsync(TEntity entity) => _fsql.Update().SetSource(entity).ExecuteAffrowsAsync(); } public abstract class BaseRepository : BaseRepository, IRepository where TEntity : class { public BaseRepository(IFreeSql fsql) : base(fsql) { } public int Delete(TKey id) => _fsql.Delete(id).ExecuteAffrows(); public Task DeleteAsync(TKey id) => _fsql.Delete(id).ExecuteAffrowsAsync(); public TEntity Find(TKey id) => _fsql.Select(id).ToOne(); public Task FindAsync(TKey id) => _fsql.Select(id).ToOneAsync(); public TEntity Get(TKey id) => Find(id); public Task GetAsync(TKey id) => FindAsync(id); } }