2016-10-17 1 views
2

C#.Net MongoDBドライバFilterDefinitionBuilderをフィルタに使用していない人はいますか?これは簡単な例ですが、私は一緒に働いているように見えません。コレクションをそのまま保管しなければならないと仮定します。目標は、指定されたArtistGenresDocumentリストにないArtistDetailsDocumentのみを取得することです。

コードはコンパイルされず、「ラムダ式を「MongoDB.Driver.FieldDefinition ArtistDetailsDocument、ArtistGenresDocument」という型に変換することはできません。これは、デリゲート型ではないためです。

ヘルプを評価してください! \ M/\ M/

public class ArtistDetailsDocument 
{ 
    public ObjectId Id { get; set; } 
    public String artist_ID { get; set; } 
    public String artistName { get; set; } 
} 

public class ArtistGenresDocument 
{ 
    public ObjectId Id { get; set; } 
    public String artist_ID { get; set; } 
    public String genre { get; set; } 
} 

IEnumerable<ArtistGenresDocument> list = await ArtistGenresCollection.Find(x => x.genre == "Pop" | x.genre == "Easy Listening").ToListAsync(); 

var filter = Builders<ArtistDetailsDocument>.Filter.Nin<ArtistGenresDocument>(x => x.artist_ID, list); 

var ArtistDetailsDocuments = ArtistDetailsCollection.Find(filter); 

答えて

2

を助けpieperuからの助けを借りて解決策であると思います

IEnumerable<ArtistGenresDocument> list = await ArtistGenresCollection 
    .Find(x => x.genre == "Pop" || x.genre == "Easy Listening") 
    //This is where your projection would go if you didnt use linq 
    //.Project(x => x.artist_ID).ToListAsync() 
    .ToListAsync(); 

var filter = Builders<ArtistDetailsDocument> 
    .Filter 
    //This is where we are plucking the Artist id with linq 
    .Nin<ArtistGenresDocument>(x => x.artist_ID, list.Select(l => l.artist_ID)); 

var ArtistDetailsDocuments = await ArtistDetailsCollection 
    .Find(filter) 
    .ToListAsync(); 

IEnumerable<ArtistGenresDocument> list = await ArtistGenresCollection 
    .Find(x => x.genre == "Pop" || x.genre == "Easy Listening") 
    .ToListAsync(); 

var filter = Builders<ArtistDetailsDocument> 
    .Filter 
    .Nin(x => x.artist_ID, list.Select(l => l.artist_ID)); 

var ArtistDetailsDocuments = await ArtistDetailsCollection 
    .Find(filter) 
    .ToListAsync(); 

public class ArtistDetailsDocument 
{ 
    public ObjectId Id { get; set; } 
    public String artist_ID { get; set; } 
    public String artistName { get; set; } 
} 

public class ArtistGenresDocument 
{ 
    public ObjectId Id { get; set; } 
    public String artist_ID { get; set; } 
    public String genre { get; set; } 
} 
+0

喜んで私は助けませんでした。もし私の投稿が役に立ったら、おそらくアップヴォートすることができます。そこには他の人にとって有益な情報があるかもしれません – pieperu

1

あなたが現在あなたの2番目のクエリ

にArtist_IDフィールドにあなたの全体のオブジェクトのコレクションを比較している、あなたの最初のクエリによって返されるオブジェクトのコレクションからArtist_Idをプルする必要があります

あなたはどちらかあなたの見つけたら、クエリのプロジェクト()メソッドでこれを達成することができます

.Project(x => x.artist_ID).ToListAsync() 

または結果が返された後、LINQを使用して

list.Select(l => l.artist_ID) 

注:フィールドは、このような何かを試してみてください、あなたのArtistGenresDocumentモデル

を上にあるものは何でもartist_IDを変更する必要がありますので、私はここにフィールドを想定しは、artist_IDことowlud(私はまたに他のいくつかのバグを修正あなたのコード)私は、これはここで

+0

これは多くの意味があります...ありがとうございます。しかし、 "x => x.artist_ID"の上にカーソルを置くと、エラーは続きます。 – 80sRocker

+0

"list"にカーソルを合わせて項目を調べると、artist_IDを推測したときのフィールドは何ですか?そして、最新のエラーは何ですか – pieperu

+1

エラーは上記と同じです。私はちょうどそれを考え出しました... Not inフィルターからを取り除くことによって。私は以前これを削除しようとしましたが、Linq式を追加するまで効果がありませんでした。私は修正された解決策を投稿します。ご協力いただきありがとうございます!!! :) – 80sRocker

関連する問題