mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-18 20:08:15 +08:00
- 增加 IBaseRepository.AsTable 重载方法支持多表表名设置;
This commit is contained in:
@ -552,6 +552,12 @@
|
||||
</summary>
|
||||
<param name="rule"></param>
|
||||
</member>
|
||||
<member name="M:FreeSql.IBaseRepository.AsTable(System.Func{System.Type,System.String,System.String})">
|
||||
<summary>
|
||||
分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository
|
||||
</summary>
|
||||
<param name="rule"></param>
|
||||
</member>
|
||||
<member name="P:FreeSql.IBaseRepository.DbContextOptions">
|
||||
<summary>
|
||||
设置 DbContext 选项
|
||||
|
@ -18,8 +18,9 @@ namespace FreeSql
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
static ConcurrentDictionary<Type, FieldInfo> _dicGetRepositoryDbField = new ConcurrentDictionary<Type, FieldInfo>();
|
||||
static FieldInfo GetRepositoryDbField(Type type) => _dicGetRepositoryDbField.GetOrAdd(type, tp => typeof(BaseRepository<,>).MakeGenericType(tp, typeof(int)).GetField("_dbPriv", BindingFlags.Instance | BindingFlags.NonPublic));
|
||||
static ConcurrentDictionary<Type, ConcurrentDictionary<string, FieldInfo>> _dicGetRepositoryDbField = new ConcurrentDictionary<Type, ConcurrentDictionary<string, FieldInfo>>();
|
||||
static FieldInfo GetRepositoryDbField(Type type, string fieldName) => _dicGetRepositoryDbField.GetOrAdd(type, tp => new ConcurrentDictionary<string, FieldInfo>()).GetOrAdd(fieldName, fn =>
|
||||
typeof(BaseRepository<,>).MakeGenericType(type, typeof(int)).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic));
|
||||
public override IDbSet Set(Type entityType)
|
||||
{
|
||||
if (_dicSet.ContainsKey(entityType)) return _dicSet[entityType];
|
||||
@ -32,7 +33,9 @@ namespace FreeSql
|
||||
{
|
||||
repo = Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(entityType, typeof(int)), _repo.Orm);
|
||||
(repo as IBaseRepository).UnitOfWork = _repo.UnitOfWork;
|
||||
GetRepositoryDbField(entityType).SetValue(repo, this);
|
||||
GetRepositoryDbField(entityType, "_dbPriv").SetValue(repo, this);
|
||||
GetRepositoryDbField(entityType, "_asTablePriv").SetValue(repo,
|
||||
GetRepositoryDbField(_repo.EntityType, "_asTablePriv").GetValue(_repo));
|
||||
|
||||
if (typeof(IBaseRepository<>).MakeGenericType(_repo.EntityType).IsAssignableFrom(_repo.GetType()))
|
||||
typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repo.EntityType)
|
||||
|
@ -30,8 +30,8 @@ namespace FreeSql
|
||||
|
||||
protected override ISelect<TEntity> OrmSelect(object dywhere)
|
||||
{
|
||||
var select = base.OrmSelect(dywhere).AsTable(_repo.AsTableSelectValueInternal);
|
||||
|
||||
var select = base.OrmSelect(dywhere);
|
||||
if (_repo._asTablePriv != null) select.AsTable(_repo._asTablePriv);
|
||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
||||
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression);
|
||||
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
|
||||
@ -42,7 +42,8 @@ namespace FreeSql
|
||||
internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere);
|
||||
protected override IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> entitys)
|
||||
{
|
||||
var update = base.OrmUpdate(entitys).AsTable(_repo.AsTableValueInternal);
|
||||
var update = base.OrmUpdate(entitys);
|
||||
if (_repo._asTablePriv != null) update.AsTable(old => _repo._asTablePriv(_entityType, old));
|
||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
||||
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) update.Where(filter.Value.Expression);
|
||||
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
|
||||
@ -53,8 +54,9 @@ namespace FreeSql
|
||||
internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys);
|
||||
protected override IDelete<TEntity> OrmDelete(object dywhere)
|
||||
{
|
||||
var delete = base.OrmDelete(dywhere).AsTable(_repo.AsTableValueInternal);
|
||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
||||
var delete = base.OrmDelete(dywhere);
|
||||
if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old));
|
||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
||||
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression);
|
||||
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
|
||||
disableFilter.AddRange((_repo.DataFilter as DataFilter<TEntity>)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key));
|
||||
@ -65,8 +67,9 @@ namespace FreeSql
|
||||
protected override IInsert<TEntity> OrmInsert(TEntity entity) => OrmInsert(new[] { entity });
|
||||
protected override IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys)
|
||||
{
|
||||
var insert = base.OrmInsert(entitys).AsTable(_repo.AsTableValueInternal);
|
||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
|
||||
var insert = base.OrmInsert(entitys);
|
||||
if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old));
|
||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
|
||||
foreach (var filter in filters)
|
||||
{
|
||||
if (entitys != null)
|
||||
|
@ -18,8 +18,7 @@ namespace FreeSql
|
||||
internal RepositoryDbSet<TEntity> _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set<TEntity>() as RepositoryDbSet<TEntity>);
|
||||
|
||||
public IDataFilter<TEntity> DataFilter { get; } = new DataFilter<TEntity>();
|
||||
internal Func<string, string> AsTableValueInternal { get; private set; }
|
||||
internal Func<Type, string, string> AsTableSelectValueInternal { get; private set; }
|
||||
internal Func<Type, string, string> _asTablePriv;
|
||||
|
||||
protected void ApplyDataFilter(string name, Expression<Func<TEntity, bool>> exp) => DataFilter.Apply(name, exp);
|
||||
|
||||
@ -60,10 +59,18 @@ namespace FreeSql
|
||||
public void AsType(Type entityType) => _dbset.AsType(entityType);
|
||||
public void AsTable(Func<string, string> rule)
|
||||
{
|
||||
AsTableValueInternal = rule;
|
||||
AsTableSelectValueInternal = rule == null ? null : new Func<Type, string, string>((a, b) => a == EntityType ? rule(b) : null);
|
||||
if (rule == null)
|
||||
{
|
||||
_asTablePriv = null;
|
||||
return;
|
||||
}
|
||||
_asTablePriv = (a, b) => a == EntityType ? rule(b) : null;
|
||||
}
|
||||
public DbContextOptions DbContextOptions { get => _db.Options; set => _db.Options = value; }
|
||||
public void AsTable(Func<Type, string, string> rule)
|
||||
{
|
||||
_asTablePriv = rule;
|
||||
}
|
||||
public DbContextOptions DbContextOptions { get => _db.Options; set => _db.Options = value; }
|
||||
|
||||
internal DbContextScopedFreeSql _ormScoped;
|
||||
internal IFreeSql OrmOriginal => _ormScoped?._originalFsql;
|
||||
|
@ -24,11 +24,16 @@ namespace FreeSql
|
||||
/// </summary>
|
||||
/// <param name="rule"></param>
|
||||
void AsTable(Func<string, string> rule);
|
||||
/// <summary>
|
||||
/// 分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository
|
||||
/// </summary>
|
||||
/// <param name="rule"></param>
|
||||
void AsTable(Func<Type, string, string> rule);
|
||||
|
||||
/// <summary>
|
||||
/// 设置 DbContext 选项
|
||||
/// </summary>
|
||||
DbContextOptions DbContextOptions { get; set; }
|
||||
/// <summary>
|
||||
/// 设置 DbContext 选项
|
||||
/// </summary>
|
||||
DbContextOptions DbContextOptions { get; set; }
|
||||
}
|
||||
|
||||
public interface IBaseRepository<TEntity> : IBaseRepository
|
||||
|
Reference in New Issue
Block a user