mongodb c#驱动程序连续选择



如果我有对象,让我们称其为 group ,其中包含一些其他对象的列表,我将其称为 brand ,此对象有一个称为模型的对象列表。

是否有一种方法仅获取模型使用mongodb c#驱动程序的列表。

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

代码应该是自称的。最后是评论,解释了什么使我感到困惑。

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());

工作输出(带有额外的选择())

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

OP输出而无需额外选择()

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

最新更新