EntityFramework Core 2.0全局过滤 (HasQueryFilter) http://www.javashuo.com/article/p-tbmflsuu-dz.html
html
定义删除的接口数据库
public interface ISoftDelete { bool IsDeleted { get; set; } }
建立模型实现ISoftDelete接口async
public class UserInfo : IAggregationRoot, ISoftDelete { public Guid Id { get; set; } public string UserName { get; private set; } public string UserPassword { get; private set; } public string UserPhone { get; private set; } public Address Address { get; private set; } public bool IsDeleted { get; set; } } [Owned] public class Address:IValueObject { public string Province { get;private set; } public string City { get; private set; } public string County { get; private set; } public string AddressDetails { get; private set; } }
Lamda的扩展以及Code First 迁移配置ide
protected override void OnModelCreating(ModelBuilder modelBuilder) { //设置软删除 foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { var parameter = Expression.Parameter(entityType.ClrType); //查询类上面是否有Owned(值对象)的特性 var ownedModelType = parameter.Type; var ownedAttribute = Attribute.GetCustomAttribute(ownedModelType, typeof(OwnedAttribute)); if (ownedAttribute == null) { var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool)); var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted")); BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false)); var lambda = Expression.Lambda(compareExpression, parameter); modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda); } } }
在这里须要过滤掉值对象的类,在值对象的类上面声明一个特性,经过该特性过滤掉该值对象, 若是该类是值对象就直接跳过,不过滤值对象EF CORE会给值对象附加一个IsDeleted的字段,EF CORE执行中会报错,提示找不到该字段
Owned是EF CORE 配置值对象的特性,能够去自定义特性,在每个值对象上面声明,在OnModelCreating 过滤掉包含这个特性的类
最终实现的代码:ui
public async Task
>> GetUserList(SearchUserDto input) { Expression > where = e => e.IsDisable == false; if (!string.IsNullOrEmpty(input.SearchName)) { where = where.And(e => e.UserName.Contains(input.SearchName)); } if (!string.IsNullOrEmpty(input.SearchPwd)) { where = where.And(e => e.UserPhone.Contains(input.SearchPwd)); } var userList = await _userRepository.LoadEntityListAsync(where, e => e.UserName, "asc", input.PageIndex, input.Pagesize); var total = await _userRepository.GetEntitiesCountAsync(where); var userDtoList = userList.MapToList (); HeaderResult
> result = new HeaderResult
> { IsSucceed = true, Result = userDtoList, Total = total }; return result; }