Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB驱动程序查询*过滤器定义生成器*Nin$Nin不在过滤器中_C#_Mongodb_Mongodb Query - Fatal编程技术网

C# MongoDB驱动程序查询*过滤器定义生成器*Nin$Nin不在过滤器中

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”,因为它不是

是否有人使用过C.Net MongoDB驱动程序筛选器DefinitionBuilder不在筛选器中?这是一个简单的例子,我放在一起,我似乎无法得到工作。假设我们必须保持集合的原样。目标是仅检索不在指定ArtistGenresDocument列表中的ArtistDetails文档

代码将不会编译,并且无法将lambda表达式转换为类型“MongoDB.Driver.FieldDefinition artistdetails document,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);

您需要从第一次查询返回的对象集合中提取艺术家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表达式之前没有任何效果。我将发布修改后的解决方案。谢谢你的帮助!!!:当然对不起,我应该发现的。这就是你通过复制和粘贴得到的:很高兴你让它工作了,如果我能帮上忙,我也很高兴我能帮上忙。如果我的帖子有用的话,也许你可以投票,里面可能有一些对其他人有用的信息