using FreeSql.Extensions.EntityUtil; using System; using System.Collections.Generic; using System.Linq; namespace FreeSql { internal class RepositoryDbSet : DbSet where TEntity : class { protected BaseRepository _repo; public RepositoryDbSet(BaseRepository repo) { _db = repo._db; _uow = repo.UnitOfWork; _repo = repo; } IUnitOfWork _uowPriv; internal override IUnitOfWork _uow { get => _uowPriv; set { _uowPriv = value; foreach (var dbset in _dicDbSetObjects.Values) //配合 UnitOfWorkManager dbset._uow = _uowPriv; } } protected override ISelect OrmSelect(object dywhere) { var select = base.OrmSelect(dywhere); if (_repo._asTablePriv != null) select.AsTable(_repo._asTablePriv); var filters = (_repo.DataFilter as DataFilter)._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(); disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); if (disableFilter.Any()) select.DisableGlobalFilter(disableFilter.ToArray()); return select; } internal ISelect OrmSelectInternal(object dywhere) => OrmSelect(dywhere); protected override IUpdate OrmUpdate(IEnumerable entitys) { var update = base.OrmUpdate(entitys); if (_repo._asTablePriv != null) update.AsTable(old => _repo._asTablePriv(_entityType, old)); var filters = (_repo.DataFilter as DataFilter)._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(); disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); if (disableFilter.Any()) update.DisableGlobalFilter(disableFilter.ToArray()); return update; } internal IUpdate OrmUpdateInternal(IEnumerable entitys) => OrmUpdate(entitys); protected override IDelete OrmDelete(object dywhere) { var delete = base.OrmDelete(dywhere); if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); var filters = (_repo.DataFilter as DataFilter)._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)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); if (disableFilter.Any()) delete.DisableGlobalFilter(disableFilter.ToArray()); return delete; } internal IDelete OrmDeleteInternal(object dywhere) => OrmDelete(dywhere); protected override IDelete OrmDeleteAsType(Type entityType) { var delete = base.OrmDeleteAsType(entityType); if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); return delete; } protected override IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected override IInsert OrmInsert(IEnumerable entitys) { var insert = base.OrmInsert(entitys); if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old)); var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { if (entitys != null) foreach (var entity in entitys) if (filter.Value.ExpressionDelegate?.Invoke(entity) == false) throw new Exception(DbContextStrings.InsertError_Filter(filter.Key, filter.Value.Expression, _db.OrmOriginal.GetEntityString(_entityType, entity))); } return insert; } internal IInsert OrmInsertInternal(TEntity entity) => OrmInsert(entity); internal IInsert OrmInsertInternal(IEnumerable entitys) => OrmInsert(entitys); } }