包含数组所有字符串的字段

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