zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【读书笔记】iOS-简单的数据驱动程序
    数据结构—单链表(类C语言描写叙述)
    使用Hadoop ACL 控制訪问权限
    Iocomp控件之数字显示【图文】
    维护的JSP站点数据丢失
    Simditor用法
    Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)
    Deferred Rendering(三)反锯齿和半透明问题
    iOS Code Sign error: Provisioning profile can&#39;t be found 解决方式
    spring
  • 原文地址:https://www.cnblogs.com/qwfy-y/p/13132216.html
Copyright © 2011-2022 走看看