2017-03-11 75 views
2

我想查詢使用官方的C#驅動程序MongoDB的集合。這裏的對象結構我創建:C#MongoDB的LINQ:無法查詢嵌套列表

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; } 
} 

這是我想要得到一個包含註釋的對象與屬性Text =「註釋1」的任何MusicFile對象的查詢:

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

我無法使這個查詢工作,它總是返回一個空的列表。我也試過這一點,這也沒有工作:

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

但是,如果我得到了完整的收集存儲,查詢的工作原理:

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

這似乎是一個非常低效的查詢方法。有什麼建議麼?

+0

我在公共汽車上,現在,所以我不能提供一個答案,但我發現,可查詢無法轉換更復雜的查詢。我建議使用過濾器生成器和elemMatch。 – john

回答

0

確定。我回到家了。試試這個:

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

注意我所說的.ToList(),因爲否則,如果通過文件多次迭代,你會得到的數據庫中相同的對象多次調用。

+0

謝謝,這個工作!我是新來使用C#MongoDB的驅動程序,但我猜LINQ是不是會是我學習的朋友。 – AnujGeek