2017-09-27 1 views
0

, 나는 브랜드를 호출합니다 그들 그룹 다른 개체의 목록이를 호출 할 수 있으며이 객체 모델라는 개체의 목록이 있습니다.MongoDB를의 C#을 드라이버 연속 SelectMany

모델 목록의 목록은 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(); 

    } 
} 
+1

SelectMany 코드에서 확인 보인다없이

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

OP 출력 (추가 선택()로) 출력 작업 시도 . 데이터가 DB에 저장 되었습니까? 다음과 같이 var models = collection.AsQueryable(). SelectMany (g => g.Brands) .ToList(). SelectMany (b => b.Models) .ToList(); – Mate

+0

@Mate 데이터는 DB에 저장됩니다. 귀하의 코드는 작동하지만, 나는 그런 식으로 사용하고 싶지 않습니다. 이 경우 두 번째 SelectMany는 C# 가상 머신에서 데이터베이스 엔진이 아닌 작업을 수행하고 더 많은 트래픽을 사용하기 때문에 – topolm

+0

괜찮습니다. C# 드라이버 버전을 확인하고 ** MongoQueryable.SelectMany **를 읽어보십시오. – Mate

답변

1

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 
    } 
}, { 
    "$unwind": "$Models" 
}, { 
    "$project": { 
     "Models": "$Models", 
     "_id": 0 
    } 
}]) 
+0

감사합니다. 두 가지 SelectMany 사이에서 Select를 사용해야하는 이유에 대해 자세히 설명해주십시오. 이것은 System.Linq와는 완전히 다른 동작입니다. – topolm

+1

@topolm 멋지다! 솔직히, 나는 이유를 모른다. 나는 "가장 인기있는"ORM으로 작업했으며 SelectMany() 번역에 문제가 있습니다. 일반적으로 솔루션은 동일하므로 출력 쿼리를 확인하십시오. 어쨌든 나는 이것에 대해 더 자세히 배우려고 노력할 것이다. 업데이트를 확인하십시오. 거기 분명하다. – Mate