Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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#中的LINQ查找MondoDB记录_C#_Mongodb_Linq_Mongodb .net Driver - Fatal编程技术网

当列表字段中的值与列表中的条件值匹配时,使用C#中的LINQ查找MondoDB记录

当列表字段中的值与列表中的条件值匹配时,使用C#中的LINQ查找MondoDB记录,c#,mongodb,linq,mongodb-.net-driver,C#,Mongodb,Linq,Mongodb .net Driver,我想使用LINQ返回MongoDB集合中的所有记录,其中记录中的字段是字符串列表,列表中的任何字符串都与用作搜索条件的字符串列表中的任何字符串值匹配: 集合中的Mongo记录(“项目”): 搜索条件: var criteria = new List<string> { "string2", "string4" }; var标准=新列表{“string2”、“string4”}; 我的代码: var foundItems = iMongoDataProvider.FindAll&l

我想使用LINQ返回MongoDB集合中的所有记录,其中记录中的字段是字符串列表,列表中的任何字符串都与用作搜索条件的字符串列表中的任何字符串值匹配:

集合中的Mongo记录(“项目”):

搜索条件:

var criteria = new List<string> { "string2", "string4" };
var标准=新列表{“string2”、“string4”};
我的代码:

var foundItems = iMongoDataProvider.FindAll<Item>()
                           .Where(x =>x.StringList.ContainsAny(criteria)).ToList();
var foundItems=iMongoDataProvider.FindAll()
.Where(x=>x.StringList.ContainsAny(标准)).ToList();

基于上述情况,应该返回Mongo记录,因为其中一个StringList值与搜索条件中的一个值匹配。即使我可以手动阅读集合并找到匹配的记录,也不会返回任何内容。我做错了什么?有人能提供一个例子来满足我的需要吗?谢谢

你有没有试过这样的方法:

using System;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System.Linq;
using System.Linq.Expressions;

var foundItems = _collection.FindAll(x=> criteria.Any(cc=> xx.StringList.Contains(cc))).ToList();

其中
\u collection
IMongoCollection\u collection

您想知道两个列表的交集是否有任何值:

 .Where(x =>x.StringList.Intersect(criteria).Any())

我不确定你的代码有什么问题,但这里有一个工作代码

void Main()
{
    List<string> []StringList = new List<string>[] {
             new List<string> {    "string1", "string2", "string3" },
             new List<string> {    "string11", "string12", "string13" },
             new List<string> {    "string21", "string22", "string4" }
    };

    var criteria = new List<string> { "string2", "string4" };

    var foundItems = StringList
                      .Where(x => x.Intersect(criteria).Any()).ToList();

    foundItems.Dump();
}
void Main()
{
列表[]StringList=新列表[]{
新列表{“string1”、“string2”、“string3”},
新列表{“string11”、“string12”、“string13”},
新列表{“string21”、“string22”、“string4”}
};
var标准=新列表{“string2”,“string4”};
var foundItems=StringList
.Where(x=>x.Intersect(criteria).Any()).ToList();
foundItems.Dump();
}

我使用LinqPad(我向任何在Linq工作的人推荐它,它是免费的)对此进行了测试。

您正在寻找的是
ElemMatch
Filter():

若你们的数据并没有那个么大,你们可以在客户端进行过滤,这也是一个好方法

如果您已经在执行
FindAll
,这意味着您获得了所有数据,您可以使用
intersect
查询它:

var foundItems = iMongoDataProvider.FindAll<Item>()
                           .Where(x => x.StringList.Intersect(criteria).Any());
var foundItems=iMongoDataProvider.FindAll()
.Where(x=>x.StringList.Intersect(criteria).Any());

变量
xx
是否已声明?我不理解此响应。正如@Hogan昨天所问的,我没有看到关于
xx
的声明。。。应该是
x
?如果是这样,那就没用了。请解释。从外观上看,这似乎是我的最佳选择,但我在运行时遇到了以下错误:“无法确定表达式的序列化信息:Enumerable.Intersect(x.StringList,System.Collections.Generic.List`1[System.String])。”我缺少一些内容。@MarkLinebarger不确定,我必须查看所有源代码才能确定,但它应该与
相同。其中(x=>criteria.Intersect(x.StringList)。Any())
这会给您带来相同的错误吗?我会得到相同的一般错误。。。以下是第二次尝试的完整错误:“System.NotSupportedException未由用户代码HResult=-2146233067 Message=处理,无法确定表达式的序列化信息:Enumerable.Intersect(System.Collections.Generic.List`1[System.String],x.StringList)。Source=MongoDB.Driver'@MarkLinebarger--请参阅我的编辑--您的代码与此工作示例有何不同?也许我的问题是尝试使用MondoDB来实现这一点。正如我在原始问题中提到的,我正在阅读Mongo中的一个集合,其中包含一个字段(StringList),该字段是字符串数组。在上面的代码中,我试图
FindAll
查找字符串数组中的任何值与列表中的任何值(条件)匹配的项目。我不知道MongoDB.Drivers是否允许这种类型的Linq表达式。有什么想法吗?尝试使用您的第一个建议,但得到一个
无法解析符号“Builders”
;对于您的第二个建议,
ToEnumerable
收到了相同的消息。不确定我缺少了什么。@MarkLinebarger如果缺少新版本的驱动程序,我已经更新了答案。对不起,我写的都是为2.x MongoDb c#drvierWe编写的,都是1.11.0.92版。我们还没有对升级到2.x时的差异进行任何研究(以及它可能导致的任何问题),因此我无法在未咨询团队的情况下进行升级。我知道在我们的解决方案中,很多地方都使用了
FindAll
;如果情况发生了巨大变化,那么解决这一问题就不值得改变。我确实知道,如果我根据其中一个标准条目找到所有条目,那么我的代码是有效的;i、 e.:
var foundItems=iMongoDataProvider.FindAll()。其中(x=>x.StringList.Contains(条件[0])).ToList()
@MarkLinebarger我已经更新了我的答案,因为我知道findall只提供所有项目,所以它不是mongodb,但是Linq问题和intersect查询应该提供有效的结果。
var foundItems = collection.Find(Builders<Item>.Filter.ElemMatch(
                     x => x.StringList,
                     s=>criteria.Contains(s)));
var foundItems = collection.Find(x=>true)
                   .ToEnumerable()
                   .Where(x => x.StringList.Intersect(criteria).Any());
var foundItems = iMongoDataProvider.FindAll<Item>()
                           .Where(x => x.StringList.Intersect(criteria).Any());