基于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属性),每次修改查询都需新增函数
- 查询的自定义输出常与预定义实体结构不匹配
已尝试方案的限制
- 不可使用Reflection,无法在运行时动态检查和操作类型
- LINQ对动态类型查询存在限制,难以实现所需灵活性
- 无法直接返回查询生成的匿名类型对象,示例代码如下:
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
相关产品推荐
相关产品推荐

