如何在MongoDB C#驱动程序中进行以下实体框架查询?
从过滤器中获取包含所有关键字的所有对象 - 名称属性
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();
例外
发生了'System.ArgumentException'类型的异常 MongoDB.Driver.dll但未在用户代码中处理 附加信息:不支持的过滤器:全部(值(System.String [])。其中({document} {Name} .Contains({document})))。
解决方案
我已将更改查询更改为M.Wiśnicki建议
return _collection.AsQueryable<Business>().AsEnumerable().Where(b => keywords.All(keyword => b.Name.Contains(keyword))).ToList();
答案 0 :(得分:2)
建议的答案是可以的,但是通过这种方式您可以将所有数据传送到客户端,查询可以直接在MongoDB
上执行:
var results = _collection.Find(Builders<Business>.Filter.Not(
Builders<Business>.Filter.ElemMatch(
x=>x.keywords,
k=>!k.Name.Contains(s))));
这有点棘手,因为我们过滤了所有不是(不包含s)的值,但它有效。
如果您没有大量数据,可以按照已经提出的方式查询Enumerable
。
答案 1 :(得分:-3)
在MongoDB中,调用LINQ查询时需要使用强类型集合。因此需要使用AsEnumerable()
,此返回输出为IEnumerable<out T>
,您将能够使用LINQ。您的查询应该看起来像
var results = Businesses.AsEnumerable().Select(x => x.ToLower())
.Where(x => keywords.All(x.Contains));