C# MongoDB驱动程序查询*过滤器定义生成器*Nin$Nin不在过滤器中
是否有人使用过C.Net MongoDB驱动程序筛选器DefinitionBuilder不在筛选器中?这是一个简单的例子,我放在一起,我似乎无法得到工作。假设我们必须保持集合的原样。目标是仅检索不在指定ArtistGenresDocument列表中的ArtistDetails文档 代码将不会编译,并且无法将lambda表达式转换为类型“MongoDB.Driver.FieldDefinition artistdetails document,ArtistGenresDocument”,因为它不是委托类型 谢谢你的帮助\m/\m/C# MongoDB驱动程序查询*过滤器定义生成器*Nin$Nin不在过滤器中,c#,mongodb,mongodb-query,C#,Mongodb,Mongodb Query,是否有人使用过C.Net MongoDB驱动程序筛选器DefinitionBuilder不在筛选器中?这是一个简单的例子,我放在一起,我似乎无法得到工作。假设我们必须保持集合的原样。目标是仅检索不在指定ArtistGenresDocument列表中的ArtistDetails文档 代码将不会编译,并且无法将lambda表达式转换为类型“MongoDB.Driver.FieldDefinition artistdetails document,ArtistGenresDocument”,因为它不是
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);
您需要从第一次查询返回的对象集合中提取艺术家Id,您当前正在将整个对象集合与第二次查询中的艺术家Id字段进行比较 您可以在查找后通过查询上的Project方法实现这一点:
.Project(x => x.artist_ID).ToListAsync()
或者在返回结果后使用linq
list.Select(l => l.artist_ID)
注意:我假设此处的字段是艺术家ID,因此您可能需要将艺术家ID更改为ArtistGenresDocument模型上的任何字段
尝试类似的方法,我还纠正了代码中的一些其他错误
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();
我希望这会有所帮助这是Piepuru帮助下的解决方案
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; }
}
这很有道理…谢谢你。但是,当我将鼠标悬停在x=>x.artist_ID上时,错误仍然存在。如果您将鼠标悬停在列表上并检查其中的项目,您有哪些字段作为我猜测的artist_ID?最新的错误是什么错误与上面的错误相同。我刚想出来。。。通过从“不在”筛选器中移除。我之前尝试过删除这个,但在添加您的Linq表达式之前没有任何效果。我将发布修改后的解决方案。谢谢你的帮助!!!:当然对不起,我应该发现的。这就是你通过复制和粘贴得到的:很高兴你让它工作了,如果我能帮上忙,我也很高兴我能帮上忙。如果我的帖子有用的话,也许你可以投票,里面可能有一些对其他人有用的信息