2017-03-11 11 views
2

公式のC#ドライバを使用してMongoDBコレクションを照会しようとしています。C#MongoDB LINQ:ネストされたリストを照会できません

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

I:

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.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

OK。私は家に帰ってきた。あなたは、ファイルを介して複数回繰り返す場合はそうでない場合は、あなたが同じオブジェクトのデータベースへの複数の呼び出しを取得します、ので、私は.ToList(呼び出し

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

注):これを試してみてください。

+0

ありがとう、これは働いた!私はC#mongodbドライバを使うのが初めてですが、LINQは私の友人ではないと思います。 – AnujGeek

関連する問題