【问题标题】:EF Core SetQueryFilter Reverse IsActive to IsDeleted in OnModelCreatingEF Core SetQueryFilter 在 OnModelCreating 中将 IsActive 反转为 IsDeleted
【发布时间】:2020-07-23 21:12:54
【问题描述】:

我在所有表格中都使用了 IsActive 列。当它的 false 没有返回时,我在 OnModelCreating 中应用了过滤器。

但我将其更改为 IsDeleted 列,因此当 IsDeleted 为 true 时,不会从 DB 返回任何内容。

这是我的过滤器代码 sn-p。但问题是当 IsDeleted 为真时,我从数据库中获取数据。但是我想当 IsDeleted 为 false 时,我会从数据库中获取数据。

var isDeletedProperty = entityType.FindProperty("IsDeleted");
if (isDeletedProperty != null && isDeletedProperty.ClrType == typeof(bool))
{
    var parameter = Expression.Parameter(entityType.ClrType, "p");
    var filter = Expression.Lambda(Expression.Property(parameter, isDeletedProperty.PropertyInfo), parameter);
    entityType.SetQueryFilter(filter);
}

【问题讨论】:

    标签: c# .net-core entity-framework-core expression-trees


    【解决方案1】:
    var isDeletedProperty = entityType.FindProperty("IsDeleted");
    if (isDeletedProperty != null && isDeletedProperty.ClrType == typeof(bool))
    {
        var parameter = Expression.Parameter(entityType.ClrType, "p");
        var filter = Expression.Lambda(
            Expression.Equal(
                Expression.Property(parameter, isDeletedProperty.PropertyInfo),
                Expression.Constant(false, typeof(bool))
            )
            , parameter);
        entityType.SetQueryFilter(filter);
    }
    

    【讨论】:

      【解决方案2】:

      目前你的过滤器是这样的

      p => p.IsDeleted
      

      即返回已删除的实体。而你真正需要的是

      p => !p.IsDeleted
      

      Expression 等效于 C# 运算符 !Expression.Not,所以只需用它包围当前条件:

      var body = Expression.Not(Expression.Property(parameter, isDeletedProperty.PropertyInfo));
      

      【讨论】:

        猜你喜欢
        • 2019-09-15
        • 2022-08-21
        • 2018-07-28
        • 1970-01-01
        • 2020-05-01
        • 1970-01-01
        • 2023-04-02
        • 2020-04-24
        • 2019-12-03
        相关资源
        最近更新 更多