MongoDB C#实现泛型Projection绑定子模型到集合节点
用C#泛型方法实现MongoDB指定子节点投影
先明确你的实体类结构大概如下:
public class Settings { public ObjectId Id { get; set; } public PartnerASettings PartnerASettings { get; set; } public PartnerBSettings PartnerBSettings { get; set; } // 其他子配置节点 } public class PartnerASettings { public string SomeKeyA { get; set; } // 子配置的属性 } public class PartnerBSettings { public string SomeKeyB { get; set; } // 子配置的属性 }
接下来是泛型方法的实现,无需手动指定字段,直接通过表达式定位子节点:
// 假设_mongoCollection是你的IMongoCollection<Settings>实例 public async Task<TSub> GetSubSettings<TSub>(Expression<Func<Settings, TSub>> subSelector) { // 从表达式中解析子节点的属性名 var memberExpr = subSelector.Body as MemberExpression; if (memberExpr == null) throw new ArgumentException("请传入正确的子节点属性表达式"); var propName = memberExpr.Member.Name; // 转换为MongoDB常用的驼峰式字段名(若集合字段与C#属性名一致则可省略此步骤) var mongoFieldName = char.ToLower(propName[0]) + propName[1..]; // 构建投影规则:仅包含指定子节点,排除默认返回的_id var projection = Builders<Settings>.Projection .Include(mongoFieldName) .Exclude("_id"); // 执行查询并获取投影后的文档 var doc = await _mongoCollection.Find(_ => true) .Project(projection) .FirstOrDefaultAsync(); // 将Bson文档中的子节点转换为目标模型 return doc?[mongoFieldName].AsBsonDocument.ToJson().ToObject<TSub>(); }
调用示例
只需传入子节点的属性表达式即可,无需手动处理字段映射:
var partnerBSettings = await GetSubSettings(s => s.PartnerBSettings);
如果需要查询多个文档,只需将FirstOrDefaultAsync替换为ToListAsync,并将方法返回类型改为List<TSub>即可。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

