有些固定的条件,基本每个查询的时候需要带的条件,我们可以使用全局过滤来帮我们,这样后面的查询就不用每次都带条件了。

微软自带的:https://docs.microsoft.com/zh-cn/ef/core/querying/filters 

特殊针对的过滤:https://entityframework-plus.net/query-filter

准备:

nuget    Z.EntityFramework.Plus.EFCore

例子:

现在我的表中有4条数据,两条是不需要的,需要过滤这两条数据

ef core 全局过滤

 

我们过滤掉IsDeleted=1的数据

① 创建过滤配置文件  DbFilterConfiguration.cs

添加方法

 

  /// <summary>
        /// 初始化全局的过滤,如软自带的
        /// </summary>
        /// <param name="entityType">过滤</param>
        /// <param name="modelBuilder">builder</param>
        public static void InitGobalFilter(IMutableEntityType entityType, ModelBuilder modelBuilder)
        {
            if (modelBuilder == null)
            {
                return;
            }
            IEnumerable<IMutableProperty> props = entityType.GetProperties();
            if (props.Any(x => x.Name == "IsDeleted"))
            {
                ParameterExpression parameter = Expression.Parameter(entityType.ClrType, "e");
                byte defaultValue = 0;
                BinaryExpression body = Expression.Equal(
                    Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(byte) }, parameter, Expression.Constant("IsDeleted")),
               Expression.Constant(defaultValue));
                modelBuilder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
                //if (entityType.Name.ToLower().Contains("view"))
                //{
                //    modelBuilder.Query(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
                //}
                //else
                //{
                //modelBuilder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
                //}
            }
        }
View Code

相关文章: