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; }
}QueryFilterAttribute 类解析
QueryFilterAttribute 是一个自定义属性类,用于在实体属性上标记查询过滤条件,主要用于构建动态查询表达式树。
主要功能
属性标记:可以应用于类的属性上(通过
AttributeTargets.Property),并且允许在同一属性上多次应用(AllowMultiple = true)。过滤条件配置:提供了丰富的配置选项来定义如何对属性值进行过滤查询。
核心属性说明
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; }
}
这样可以在运行时根据这些标记自动生成相应的查询表达式。