C # MongoDb драйвер включает дочерний объект - PullRequest
0 голосов
/ 30 октября 2019

Я новичок в Mongo, и у меня есть проект, использующий драйвер C # MongoDb и Linq для извлечения данных из MongoDb.

У меня есть объект с именем Instance, из которого я получаю данныеколлекция Монго просто отлично. Однако свойство Template объекта принадлежит отдельной коллекции и имеет значение null при запросе коллекции Instance. Я бы хотел загружать данные шаблона при запросе экземпляра.

Это было бы эквивалентно методу Include Entity Framework, который загружает связанные сущности. Я искал в сети эквивалентный подход с использованием драйвера 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

1 Ответ

1 голос
/ 31 октября 2019

У вас может быть Typed Lookup, например, такой>> 1001 *

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.

...