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

时间:2017-01-05 08:32:22

标签: c# .net mongodb entity-framework mongodb-.net-driver

如何在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();

2 个答案:

答案 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));