namespace Dpz.Core.Entity.Base.ExpressTreeQuery;

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class QueryFilterAttribute : Attribute
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="condition">请求参数需要达成的条件</param>
    public QueryFilterAttribute(FilterCondition condition)
    {
        Condition = condition;
    }

    /// <summary>
    /// 请求参数需要达成的条件
    /// </summary>
    public FilterCondition Condition { get; }

    /// <summary>
    /// <code>Condition == FilterCondition.EqualValue</code>
    /// 需达成条件的比较值
    /// </summary>
    public object? ConditionValue { get; set; }

    /// <summary>
    /// 比较方式
    /// 默认为 Equal
    /// </summary>
    public Comparison Comparison { get; set; } = Comparison.Equal;

    /// <summary>
    /// 需要比较的字段名称
    /// 默认为 Null
    /// 为 Null 时,获取与该属性相同的属性名称
    /// </summary>
    public string? PropertyName { get; set; }

    /// <summary>
    /// 需要比较字段的值
    /// 默认为 string "10001"
    /// 值为 "10001" 时,会忽略 PropertyValue 值
    /// </summary>
    public object? PropertyValue { get; set; } = GenerateConditionFilter.DefaultPropertyValue;

    /// <summary>
    /// 筛选结束时间 是否 +1 天
    /// </summary>
    public bool EndAddDay { get; set; }
    
    /// <summary>
    /// 是否筛选一天内的时间
    /// 只支持 <see cref="DateTime"/> 类型
    /// </summary>
    public bool FilterInDay { get; set; }

    /// <summary>
    /// 实体类型
    /// </summary>
    public Type? EntityType { get; set; }

    /// <summary>
    /// 筛选值为 false 时,是否包含 NULL 值
    /// </summary>
    public bool FalseHasNull { get; set; }

    /// <summary>
    /// 比较方式<see cref="Comparison"/> == <see cref="Comparison.SplitOrContains"/> 时,用于分隔字符串的除了空格的其他分隔符
    /// </summary>
    public char[]? SplitOrContainsOtherSeparators { get; set; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

QueryFilterAttribute 类解析

QueryFilterAttribute 是一个自定义属性类,用于在实体属性上标记查询过滤条件,主要用于构建动态查询表达式树。

主要功能

  1. 属性标记:可以应用于类的属性上(通过 AttributeTargets.Property),并且允许在同一属性上多次应用(AllowMultiple = true)。

  2. 过滤条件配置:提供了丰富的配置选项来定义如何对属性值进行过滤查询。

核心属性说明

  • Condition (FilterCondition):必需参数,定义请求参数需要满足的基本条件类型。

  • ConditionValue (object?):当 Condition == FilterCondition.EqualValue 时,指定需要比较的值。

  • Comparison (Comparison):指定比较方式,默认为 Equal(等于)。

  • PropertyName (string?):指定要比较的字段名称,如果为 null 则使用被标记属性的名称。

  • PropertyValue (object?):指定要比较的字段值,默认值为 "10001"(特殊值,表示忽略此值)。

  • EndAddDay (bool):对于时间筛选,是否在结束时间上加1天(常用于日期范围查询)。

  • FilterInDay (bool):是否只筛选一天内的时间(仅支持 DateTime 类型)。

  • EntityType (Type?):指定关联的实体类型。

  • FalseHasNull (bool):当比较值为 false 时,是否包含 NULL 值。

  • SplitOrContainsOtherSeparators (char[]?):当比较方式为 SplitOrContains 时,指定除空格外的其他分隔符。

使用场景

这个属性通常用于:

  • 动态构建数据库查询条件
  • API 参数过滤
  • 复杂查询条件的声明式配置

例如,可以在实体类属性上这样使用:

public class User
{
    [QueryFilter(FilterCondition.Required, Comparison.Equal)]
    public string Name { get; set; }
    
    [QueryFilter(FilterCondition.Optional, Comparison.GreaterThanOrEqual)]
    public DateTime? CreateTime { get; set; }
}

这样可以在运行时根据这些标记自动生成相应的查询表达式。

评论加载中...