EFCore批量實現全局查詢篩選器


protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property<string>("_tenantId").HasColumnName("TenantId");

    // Configure entity filters
    modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "_tenantId") == _tenantId);
    modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
}

官方的做法要一個一個的寫,很麻煩。我給大家介紹一種批量實現全局查詢篩選器的方法
首先定義一個通用的接口

public interface IAudit
    {
        public DateTime CreationTime { get; set; }
        public DateTime? DeletionTime { get; set; }
        public DateTime? LastModificationTime { get; set; }
        public bool IsDeleted { get; set; }
    }
public class AuditModel : IAudit
    {
        public DateTime CreationTime { get; set; }
        public DateTime? DeletionTime { get; set; }
        public DateTime? LastModificationTime { get; set; }
        public bool IsDeleted { get; set; }
    }

public class Article:AuditModel
    {
        public int TagId { get; set; }
        public string Title { get; set; }
        public int Support { get; set; }
        public int Comment { get; set; }
        public int Visited { get; set; }
        public string Digest { get; set; }
        public string Url { get; set; }
        public Tag Tag { get; set; }
    }

然后實現接口,並根據需求繼承實現接口的類,這里我讓Article類繼承。

var entityTypeList = modelBuilder.Model.GetEntityTypes().Where(x => typeof(IAudit).IsAssignableFrom(x.ClrType));
            foreach (var entityType in entityTypeList)
            {
                var parameter = Expression.Parameter(entityType.ClrType);
                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 lambdaExpression = Expression.Lambda(compareExpression, parameter);

                modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambdaExpression);
            }

這樣就可以為所有實現了Iautdit接口的類定義一個全局查詢篩選器(我這里是篩選出Isdelete為flase的數據);

參考文章:https://www.cnblogs.com/CreateMyself/p/8491058.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM