MongoDb c#驱动连续SelectMany

top*_*olm 1 c# mongodb-.net-driver

如果我有对象,让它们称为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();

    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ate 5

尝试

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

Console.WriteLine(models.Count());
Run Code Online (Sandbox Code Playgroud)

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

aggregate([{
    "$unwind": "$Brands"
}, {
    "$project": {
        "Brands": "$Brands",
        "_id": 0
    }
}, {
    "$project": {
        "Models": "$Brands.Models",
        "_id": 0
    }
}, {
    "$unwind": "$Models"
}, {
    "$project": {
        "Models": "$Models",
        "_id": 0
    }
}])
Run Code Online (Sandbox Code Playgroud)

没有额外 Select() 的 OP 输出

 aggregate([{
    "$unwind": "$Brands"
}, {
    "$project": {
        "Brands": "$Brands",
        "_id": 0
    }
}, {
    "$unwind": "$Models"
}, {
    "$project": {
        "Models": "$Models",
        "_id": 0
    }
}])
Run Code Online (Sandbox Code Playgroud)