2016-10-17 56 views
2

有没有人使用C#.Net MongoDB驱动程序FilterDefinitionBuilder的不在过滤器中?这是一个简单的例子,我放在一起,我似乎无法工作。假设我们必须保留收藏。目标是只检索不在指定的ArtistGenresDocument列表中的ArtistDetailsDocument。

该代码不会编译并指出“无法将lambda表达式转换为类型'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") 
    .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

很高兴我不能帮助。如果我的帖子很有用,也许你可以upvote,那么其他人可能会有一些有用的信息 – pieperu

1

你需要从正在通过你的第一个查询返回的,您目前比较整个对象集合到Artist_ID场在你的第二个查询

对象的集合拉Artist_Id

您可以与您的发现后的查询项目()方法实现这一目标:

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

或使用LINQ的结果已返回后

list.Select(l => l.artist_ID) 

注:我认为该字段这里owlud是artist_ID,所以你可能需要改变artist_ID对什么领域是你的ArtistGenresDocument模型

尝试是这样的(我也纠正一些其他的bug您的代码)

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

我希望这有助于

+0

这使得很多道理......谢谢。但是,当我将鼠标悬停在“x => x.artist_ID” – 80sRocker

+0

上时,错误仍然存​​在如果您将鼠标悬停在“列表”上并检查其中的项目,那么您在我猜到artist_ID时有哪些字段?什么是最新的错误 – pieperu

+1

错误与上面相同。我只是想通过从Not in过滤器中删除来解决这个问题。我曾尝试删除此更早,但它没有影响,直到我已经添加您的Linq表达式。我将发布修改后的解决方案。谢谢你的帮助!!! :) – 80sRocker