首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型生成器ef核3中IsDelete字段的自动筛选查询

模型生成器ef核3中IsDelete字段的自动筛选查询
EN

Stack Overflow用户
提问于 2020-04-24 05:02:23
回答 1查看 204关注 0票数 1

当标志为IsDelete=true时,我不想返回实体。我为所有实体编写了这段代码:

代码语言:javascript
复制
builder.HasQueryFilter(x => !x.IsDelete)

我想为模型构建器中的所有实体编写代码,而不是像在IentityTypeConfiguration中一个接一个地编写代码。

,我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-24 05:46:38

此实现要求您的实体实现ISoftDeleteAware接口,因此如果您有自己的接口,只需相应地重命名:

代码语言:javascript
复制
public interface ISoftDeleteAware
{
    bool IsDeleted { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);        
    //Mapping code etc …        
    var versionedEntities = modelBuilder.Model.GetEntityTypes();

    foreach (var entityType in versionedEntities)
    {
        modelBuilder.Entity(entityType.ClrType, entityBuilder =>
        {
        //Global Filters
        var lambdaExp = ApplyEntityFilterTo(entityType.ClrType);    
        if (lambdaExp != null)
            entityBuilder.HasQueryFilter(lambdaExp);
        });
    }
}

protected virtual LambdaExpression ApplyEntityFilterTo(Type entityClrType)
{
    if (typeof(ISoftDeleteAware).IsAssignableFrom(entityClrType))
    {
        var parameter = Expression.Parameter(entityClrType, "entity");            
        var member = Expression.Property(parameter, nameof(ISoftDeleteAware.IsDeleted));            
        var body = Expression.Equal(member, Expression.Constant(false));                
        return Expression.Lambda(body, parameter);
    }
    return null;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61401480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档