首页 新闻 会员 周边

Ef Core 多租户实体过滤的问题

0
悬赏园豆:20 [已解决问题] 解决于 2022-04-22 17:47

现在是通过每个实体单独过滤的方式,想要改成全部实体同时过滤的方案,但是因为类型无法确定导致这个方法无法使用,该怎么解决啊

类似这样的意思

咳咳Pro的主页 咳咳Pro | 初学一级 | 园豆:114
提问于:2022-04-21 17:08
< >
分享
最佳答案
0

用这个方法呢:modelBuilder.Entity<YourType>(m => dosomthing)

收获园豆:20
会长 | 专家六级 |园豆:12401 | 2022-04-21 17:18

这个类似与单独指定的实体,我想要的是所有实体一起指定和过滤

咳咳Pro | 园豆:114 (初学一级) | 2022-04-21 17:32

可将所有实体继承于同一个类,将TenentId放到父类中。

会长 | 园豆:12401 (专家六级) | 2022-04-22 07:31
其他回答(2)
0

var parameter = Expression.Parameter(item, "u");
MemberExpression entityTenantId = Expression.Property(parameter, "TenantId");
var properyName = Expression.Constant("TenantId");

                var propertyValue = Expression.Call(Expression.Constant(this), this.GetType().GetMethod(nameof(GetTenantId))!);
                //var left = Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(object) }, parameter, properyName);
                var left = entityTenantId;
                var expressionBody = Expression.Equal(left, propertyValue);
                var expression = Expression.Lambda(expressionBody, parameter);


                modelBuilder.Entity(item).HasQueryFilter(expression);

通过动态生成表达式树的方法进行的,对应的条件是一个方法,这样每次调用都会取访问这个方法

咳咳Pro | 园豆:114 (初学一级) | 2022-04-22 17:46
0

类似这种

modelBuilder.SetQueryFilterOnAllEntities<ISoftDelete>(x => x.Deleted == false);

public static void SetQueryFilterOnAllEntities<TEntityInterface>(
            this ModelBuilder builder,
            Expression<Func<TEntityInterface, bool>> filterExpression)
        {
            foreach (var type in builder.Model.GetEntityTypes()
                .Where(t => t.BaseType == null)
                .Select(t => t.ClrType)
                .Where(t => typeof(TEntityInterface).IsAssignableFrom(t)))
            {
                builder.Entity(type)
                    .AppendQueryFilter(filterExpression);
            }
        }

        private static void AppendQueryFilter(this EntityTypeBuilder entityTypeBuilder, LambdaExpression expression)
        {
            var parameterType = Expression.Parameter(entityTypeBuilder.Metadata.ClrType);

            var expressionFilter = ReplacingExpressionVisitor.Replace(
                expression.Parameters.Single(), parameterType, expression.Body);

            if (entityTypeBuilder.Metadata.GetQueryFilter() != null)
            {
                var currentQueryFilter = entityTypeBuilder.Metadata.GetQueryFilter();
                var currentExpressionFilter = ReplacingExpressionVisitor.Replace(
                    currentQueryFilter.Parameters.Single(), parameterType, currentQueryFilter.Body);
                expressionFilter = Expression.AndAlso(currentExpressionFilter, expressionFilter);
            }

            var lambdaExpression = Expression.Lambda(expressionFilter, parameterType);
            entityTypeBuilder.HasQueryFilter(lambdaExpression);
        }
huiyuanai709 | 园豆:487 (菜鸟二级) | 2022-04-22 17:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册