包含数组所有字符串的字段
Field that contains all the strings of an array
如何在 MongoDB C# 驱动程序中进行以下 Entity framework 查询?
从过滤器中获取包含所有关键字的所有对象 - 在其名称中 属性
var keywords = filter.Split(' ');
_context.Businesses
.Where(b => keywords.All(s=>b.Name.Contains(s)))
.ToList();
我试图在 mongo 上执行相同的查询,但我发现过滤器不受支持
_collection.Find<Business>(b => keywords.All(s => b.Name.Contains(s))).ToList();
异常
An exception of type 'System.ArgumentException' occurred in
MongoDB.Driver.dll but was not handled in user code
Additional information: Unsupported filter: All(value(System.String[]).Where({document}{Name}.Contains({document}))).
解决方案
我已经根据 M.Wiśnicki 的建议更改了查询
return _collection.AsQueryable<Business>().AsEnumerable().Where(b => keywords.All(keyword => b.Name.Contains(keyword))).ToList();
在 MongoDB 中,您需要在调用 LINQ 查询时使用强类型集合。因此需要使用 AsEnumerable()
,此 return 输出为 IEnumerable<out T>
,您将能够使用 LINQ。您的查询应该类似于
var results = Businesses.AsEnumerable().Select(x => x.ToLower())
.Where(x => keywords.All(x.Contains));
建议的答案是可以的,但是这样你就可以将所有数据发送给客户端,查询可以直接在 MongoDB
:
上执行
var results = _collection.Find(Builders<Business>.Filter.Not(
Builders<Business>.Filter.ElemMatch(
x=>x.keywords,
k=>!k.Name.Contains(s))));
这有点棘手,因为我们过滤了所有不(不包含 s)但它有效的值。
如果您没有大量数据,可以按照已经提议的方式查询 Enumerable
。
如何在 MongoDB C# 驱动程序中进行以下 Entity framework 查询?
从过滤器中获取包含所有关键字的所有对象 - 在其名称中 属性
var keywords = filter.Split(' ');
_context.Businesses
.Where(b => keywords.All(s=>b.Name.Contains(s)))
.ToList();
我试图在 mongo 上执行相同的查询,但我发现过滤器不受支持
_collection.Find<Business>(b => keywords.All(s => b.Name.Contains(s))).ToList();
异常
An exception of type 'System.ArgumentException' occurred in MongoDB.Driver.dll but was not handled in user code Additional information: Unsupported filter: All(value(System.String[]).Where({document}{Name}.Contains({document}))).
解决方案
我已经根据 M.Wiśnicki 的建议更改了查询
return _collection.AsQueryable<Business>().AsEnumerable().Where(b => keywords.All(keyword => b.Name.Contains(keyword))).ToList();
在 MongoDB 中,您需要在调用 LINQ 查询时使用强类型集合。因此需要使用 AsEnumerable()
,此 return 输出为 IEnumerable<out T>
,您将能够使用 LINQ。您的查询应该类似于
var results = Businesses.AsEnumerable().Select(x => x.ToLower())
.Where(x => keywords.All(x.Contains));
建议的答案是可以的,但是这样你就可以将所有数据发送给客户端,查询可以直接在 MongoDB
:
var results = _collection.Find(Builders<Business>.Filter.Not(
Builders<Business>.Filter.ElemMatch(
x=>x.keywords,
k=>!k.Name.Contains(s))));
这有点棘手,因为我们过滤了所有不(不包含 s)但它有效的值。
如果您没有大量数据,可以按照已经提议的方式查询 Enumerable
。