网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Dpz.Core.Infrastructure.Entity;
using MongoDB.Bson;
using MongoDB.Driver;

namespace Dpz.Core.Infrastructure.ExpressTreeQuery;

public class BuildFilter<TEntity,TRequest>(TRequest request)
    where TEntity : IBaseEntity
{
    private readonly FilterDefinition<TEntity> _empty = Builders<TEntity>.Filter.Empty;

    // private readonly T _request = request;

    public List<FilterDefinition<TEntity>> Build()
    {
        var properties = GetProperties();
        foreach (var item in properties) { }

        // todo
        return [_empty];
    }

    private List<PropertyInfo> GetProperties()
    {
        return request?
            .GetType()
            .GetProperties()
            .Where(x => x.GetCustomAttribute<IgnorePropertyAttribute>() == null)
            .ToList() ?? [];
    }

    private FilterDefinition<TEntity> BuildItemFilter(PropertyInfo property)
    {
        var queryFilters = property.GetCustomAttributes<QueryFilterAttribute>().ToList();
        if (queryFilters.Count > 0)
        {
            // todo
            return _empty;
        }

        var value = property.GetValue(request);
        if (value == null)
        {
            return _empty;
        }
        
        
        var entityProperty = typeof(TEntity).GetProperty(property.Name);
        if (entityProperty == null || entityProperty.PropertyType != property.PropertyType)
        {
            return _empty;
        }

        if (value is string strValue)
        {
            if (string.IsNullOrEmpty(strValue))
            {
                return _empty;
            }
            Builders<TEntity>.Filter.Regex(property.Name, new BsonRegularExpression(strValue, "i"));
        }

        if (value is DateTime dateTime)
        {
            
        }

        return _empty;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个名为 BuildFilter<TEntity, TRequest> 的泛型类,目的是根据传入的请求对象 request 动态构建 MongoDB 的查询过滤器。以下是代码的主要功能和结构的详细解释:

类的结构

  1. 泛型参数:

    • TEntity: 代表 MongoDB 中的实体类型,必须实现 IBaseEntity 接口。
    • TRequest: 代表请求对象的类型,包含用于构建过滤器的属性。
  2. 私有字段:

    • _empty: 一个空的过滤器定义,使用 Builders<TEntity>.Filter.Empty 创建。

主要方法

  1. Build() 方法:

    • 该方法用于构建过滤器列表。它获取请求对象的属性,并为每个属性生成相应的过滤器(目前尚未实现具体逻辑)。
    • 返回一个包含空过滤器的列表。
  2. GetProperties() 方法:

    • 该方法获取请求对象中所有的公共属性,并过滤掉带有 IgnorePropertyAttribute 特性的属性。
    • 返回一个 PropertyInfo 的列表,表示可以用于构建过滤器的属性。
  3. BuildItemFilter(PropertyInfo property) 方法:

    • 该方法根据传入的属性构建单个过滤器。
    • 首先检查属性是否有 QueryFilterAttribute 特性,如果有,则可以根据该特性构建过滤器(目前尚未实现)。
    • 获取属性的值,如果值为 null,则返回空过滤器。
    • 检查实体中是否存在与请求属性同名的属性,并且类型匹配。如果不匹配,则返回空过滤器。
    • 如果属性值是字符串类型,则使用正则表达式构建过滤器(目前尚未返回构建的过滤器)。
    • 如果属性值是 DateTime 类型,代码中留有待实现的逻辑。

代码中的待办事项(TODO)

  • Build() 方法中,循环遍历属性并为每个属性生成过滤器的逻辑尚未实现。
  • BuildItemFilter() 方法中,处理 QueryFilterAttribute 特性和 DateTime 类型的过滤器逻辑也尚未实现。

总结

总体来说,这段代码的目的是为 MongoDB 查询动态构建过滤器,基于请求对象的属性。它通过反射获取请求对象的属性,并根据这些属性的值生成相应的 MongoDB 过滤器。虽然目前代码尚未完成,但它为实现动态查询过滤器提供了一个良好的基础。

loading