MongoDb c#驱动连续SelectMany

MongoDb c# driver consecutive SelectMany

如果我有对象,我们称它们为 Group,其中包含一些其他对象的列表,我将其称为 Brand,而这个对象有一个名为 Model.

的对象列表

有没有办法使用 MongoDb c# 驱动程序仅获取 型号 的列表。

我尝试多次使用 SelectMany 但没有成功。如果我放了多个 SelectMany 我总是得到一个空列表。

代码应该是不言自明的。 最后是解释我困惑的评论。

class Group
{
    [BsonId(IdGenerator = typeof(GuidGenerator))]
    public Guid ID { get; set; }
    public string Name { get; set; }
    public List<Brand> Brands { get; set; }
}

class Brand
{
    public string Name { get; set; }
    public List<Model> Models { get; set; }
}

class Model
{
    public string Name { get; set; }
    public int Produced { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        MongoClient client = new MongoClient("mongodb://127.0.0.1:32768");
        var db = client.GetDatabase("test");
        var collection = db.GetCollection<Group>("groups");

        var fca = new Group { Name = "FCA" };

        var alfaRomeo = new Brand { Name = "Alfra Romeo" };
        var jeep = new Brand { Name = "Jeep" };
        var ferrari = new Brand { Name = "Ferrari"};

        var laFerrari = new Model { Name = "LaFerrari", Produced = 4 };

        var wrangler = new Model { Name = "Wrangler", Produced = 3 };
        var compass = new Model { Name = "Compass", Produced = 8 };

        var giulietta = new Model { Name = "Giulietta", Produced = 7 };
        var giulia = new Model { Name = "Giulia", Produced = 8 };
        var _4c = new Model { Name = "4C", Produced = 6 };        

        fca.Brands = new List<Brand> { ferrari, alfaRomeo, jeep };

        ferrari.Models = new List<Model> { laFerrari };
        jeep.Models = new List<Model> { wrangler, compass };
        alfaRomeo.Models = new List<Model> { giulietta, giulia, _4c };

        collection.InsertOne(fca);                 

        Console.WriteLine("press enter to continue");
        Console.ReadLine();

        var models = collection.AsQueryable().SelectMany(g => g.Brands).SelectMany(b => b.Models).ToList();
        Console.WriteLine(models.Count);    //returns 0 I expected 6
        Console.ReadLine();

    }
}

尝试

var models = collection.AsQueryable()
 .SelectMany(g => g.Brands)
 .Select(y => y.Models)
 .SelectMany(x=> x);

Console.WriteLine(models.Count());

工作输出(带有额外的 Select())

aggregate([{
    "$unwind": "$Brands"
}, {
    "$project": {
        "Brands": "$Brands",
        "_id": 0
    }
}, {
    "$project": {
        "Models": "$Brands.Models",
        "_id": 0
    }
}, {
    "$unwind": "$Models"
}, {
    "$project": {
        "Models": "$Models",
        "_id": 0
    }
}])

OP 输出没有额外的 Select()

 aggregate([{
    "$unwind": "$Brands"
}, {
    "$project": {
        "Brands": "$Brands",
        "_id": 0
    }
}, {
    "$unwind": "$Models"
}, {
    "$project": {
        "Models": "$Models",
        "_id": 0
    }
}])