2017-03-11 6 views
2

Ich versuche eine MongoDB-Sammlung mit einem offiziellen C# -Treiber abzufragen. Hier ist die Objektstruktur die ich angelegt habe:C# MongoDB LINQ: Verschachtelte Liste kann nicht abgefragt werden

IMongoDatabase db = mongoClient.GetDatabase("appdb"); 
IMongoCollection<MusicFile> musicfiles = db.GetCollection<MusicFile>("files"); 

public class MusicFile 
{ 
     public ObjectId Id { get; set; } 

     public string Name { get; set; } 

     public IList<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public string Text { get; set; } 
} 

Dies ist die Abfrage Ich versuche, alle MusicFile Objekte zu erhalten, die einen Kommentar Objekt mit Eigenschafts Text enthält = „Comment1“:

musicfiles.AsQueryable().Where(f => f.Comments != null && f.Comments.Any(c => c.Text == "Comment1")).ToList(); 

I kann diese Abfrage nicht funktionieren, es gibt immer eine leere Liste zurück. Ich habe auch versucht diese, die auch nicht funktioniert hat:

musicfiles.Find(f => f.Comments.Any(c => c.Text == "Comment1")).ToList() 

Aber wenn ich die komplette Sammlung Speicher zu erhalten, ist die Abfrage funktioniert:

musicfiles.Find(FilterDefinition<MusicFile>.Empty).ToList().Where(f => f.Comments != null && f.Comments.Any(c => c.Text == "Comment1")).ToList(); 

Dies scheint ein sehr ineffizienter Weg zur Abfrage . Irgendwelche Vorschläge?

+0

Ich bin gerade in einem Bus, so kann ich keine Antwort liefern, aber ich habe festgestellt, dass abfragbare kann nicht komplizierter Abfragen konvertieren. Ich würde empfehlen, den Filter Builder und ElemMatch zu verwenden. – john

Antwort

0

OK. Ich bin wieder zu Hause. Versuchen Sie folgendes:

var musicFilter = Builders<MusicFile>.Filter; 
var commentFilter = Builders<Comment>.Filter; 

var files = musicfiles 
       .Find(
        musicFilter.NE(m => m.Comments, null) 
        & musicFilter.ElemMatch(m => m.Comments, commentFilter.Eq(c => c.Text, "Comment1")) 
       ) 
       .ToEnumerable() 
       .ToList(); 

Hinweis nenne ich .ToList(), weil sonst, wenn Sie Dateien mehrmals durchlaufen, werden Sie mehrere Anrufe auf die Datenbank für die gleichen Objekte erhalten.

+0

Danke, das hat funktioniert! Ich bin neu in der Verwendung von C# mongodb Treiber, aber ich denke LINQ wird nicht mein Freund beim Lernen sein. – AnujGeek

Verwandte Themen