繁体   English   中英

C# MongoDb驱动包括子object

[英]C# MongoDb driver include child object

我是 Mongo 的新手,并且有一个项目使用C# MongoDb 驱动程序和 Linq 从 ZC13D2009A3AAE2AB 检索数据。

我有一个名为Instance的 object ,我可以从 Mongo 集合中检索到它。 但是,对象的Template属性属于单独的集合,在查询 Instance 集合时为 null。 我想在查询实例时急切加载模板数据。

这相当于 Entity Framework 的Include方法,它急切地加载相关实体。 我已经在网上搜索了使用 C# Mongo 驱动程序的等效方法,但没有运气。

如何使用 C# MongoDb 驱动程序和 Linq 完成此操作?

public class Instance
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? TemplateId { get; set; }
    public Template Template { get; set; }
}
public class Template
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var collection = MongoDatabase.GetCollection<Instance>("Instances").AsQueryable()
var instance = collection.First(i => i.Id == 1);
var template = instance.Template; //always null

您可以像这样进行类型查找>

public class Instance
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public ObjectId TemplateId { get; set; }
    public Template Template { get; set; }
}

public class Template
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}


string connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);

var db = client.GetDatabase("test");
var instances = db.GetCollection<Instance>("Instances");
var resultOfJoin = instances.Aggregate()
    .Lookup("Templates", "TemplateId", "_id", @as: "Template")
    .Unwind("Template")
    .As<Instance>()
    .ToList();

编辑:展开 jcruz 编辑的部分。

对于急切的负载尝试使用

公共虚拟模板模板 { 获取; 放; } 例如。 但是如果你想从子表中检索数据,你仍然必须使用 Include(),

您可以从应该具有模板 PK 的实例中获取模板 ID,而无需包含

已针对 EF Core 6.3 测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM