You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ABP框架的C#动态构建MongoDB查询及返回对象方案咨询

基于ABP框架的MongoDB动态查询与返回对象优化需求

场景与现有实现

在基于ABP框架的.NET应用中,需根据用户输入动态构建MongoDB查询及返回对象。以下是一段按指定周期分组查询记录的现有实现代码:

public class RecordRepository : MongoDbRepository<MyRecordsMongoDbContext, Record, Guid>, IRecordRepository
{
    public async Task<List<RecordValuesGroupByPeriod>> GetRecordsGroupByPeriod(string recordName, string? period)
    {
        var groupByPeriod = from record in (await GetMongoQueryableAsync())
                            where record.Name == recordName && 
                            (period.IsNullOrEmpty() || record.Ancestor.TextualFields["PERIOD"] == period)
                            group record by record.Ancestor.TextualFields["PERIOD"] into @group
                            select new RecordValuesGroupByPeriod()
                            {
                                GroupName= @group.Key,
                                Records = @group.ToList()
                            };

        return await groupByPeriod.ToListAsync();
    }

    public class RecordValuesGroupByPeriod
    {
        public string GroupName { get; set; }
        public List<Record> Records { get; set; }
    }

    public class Record
    {
        public Guid Id { get; protected set; } = Guid.NewGuid();
        public Guid DocumentId { get; set; }
        public string Name { get; set; }
        public Dictionary<string, string?> TextualFields { get; set; } = [];
        public Dictionary<string, DateTime?> DateFields { get; set; } = [];
        public Dictionary<string, decimal?> DecimalFields { get; set; } = [];
        public Record? Ancestor { get; set; } = null;
        // 其他属性省略
    }
}

注:Record对应Document中的行,每行包含独立信息且与其他行存在层级关系。

当前痛点

  • 为每种用户查询编写专用函数并显式声明返回对象,导致函数数量激增,代码库适应性差、维护成本高
  • 当查询复杂度提升时(如A1与B1按Category关联查询、按B1.Id获取B1.Category属性),每次修改查询都需新增函数
  • 查询的自定义输出常与预定义实体结构不匹配

已尝试方案的限制

  1. 不可使用Reflection,无法在运行时动态检查和操作类型
  2. LINQ对动态类型查询存在限制,难以实现所需灵活性
  3. 无法直接返回查询生成的匿名类型对象,示例代码如下:
public async Task<List<object>> GetRecordsWithAncestors(string recordName)
{
    var recordsWithAncestors = from record in (await GetMongoQueryableAsync())
                             where record.Name == recordName
                             select new 
                             {
                                 Name = record.Name,
                                 AncestorName = record.Ancestor.Name
                             };

    return await recordsWithAncestors.ToListAsync();
}

需求

寻求增强代码动态性的方案,以及对现有实现的潜在问题分析与优化建议。


内容的提问来源于stack exchange,提问作者Flávio Farias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:35:09