2017-09-27 4 views
0

私はオブジェクトを持っている場合、私はブランドそれを呼び出します、そしてこのオブジェクトはモデルと呼ばれるオブジェクトのリストを持っているいくつかの他のオブジェクトのリストを持っていることグループそれらを呼び出すことができます。MongoDBのC#のドライバの連続SelectMany

モデルのリストのみを取得する方法はありますか?MongoDb c#driverを使用してください。

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

    } 
} 
+1

SelectManyはあなたのコードでOKと思われる余分な選択(なし

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

OP出力(追加選択()と)

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

の作業出力)を試してみてください。データはDBに保存されましたか? SelectMany(g => g.Brands).ToList()。SelectMany(b => b.Models).ToList(); var models = collection.AsQueryable();を試してください。 – Mate

+0

@MateデータはDBに保存されます。あなたのコードは動作しますが、私はそのように使用したくありません。その場合、2番目のSelectManyはC#仮想マシン上でデータベースエンジンではなく、もっと多くのトラフィックを使用するので、 – topolm

+0

私は理解して、あなたのC#ドライバのバージョンをチェックし、** MongoQueryable.SelectMany ** – Mate

答えて

1

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

を読んでください。 2つのSelectManyの間でSelectを使用する必要がある理由を詳細に説明してください。これはSystem.Linqとはまったく異なる動作です。 – topolm

+1

@topolm素晴らしい!正直なところ、私は理由を知らない。私は "最も一般的な" ORMで作業しており、それらのすべてがSelectMany()翻訳に何らかの問題を抱えています。 通常、解決策は同じです。出力クエリを確認します。 とにかくこれについてもっと知ろうとします。 更新を確認してください。そこははっきりしている – Mate

関連する問題