¿Cómo realizar la siguiente consulta de Entity Framework en el controlador MongoDB C#?
Obtenga todos los objetos que contienen todas las palabras clave del filtro, en su propiedad de nombre
var keywords = filter.Split(' '); _context.Businesses .Where(b => keywords.All(s=>b.Name.Contains(s))) .ToList();Intenté ejecutar la misma consulta en mongo pero entiendo que el filtro no es compatible
_collection.Find<Business>(b => keywords.All(s => b.Name.Contains(s))).ToList();La excepción
Se produjo una excepción de tipo 'System.ArgumentException' en MongoDB.Driver.dll pero no se manejó en el código de usuario Información adicional: Filtro no admitido: All(value(System.String[]).where({document}{Name}.Contains ({documento}))).
Solución
Cambié la consulta como sugirió M.Wiśnicki
return _collection.AsQueryable<Business>().AsEnumerable().Where(b => keywords.All(keyword => b.Name.Contains(keyword))).ToList();La respuesta propuesta estará bien, pero de esta manera obtendrá todos los datos para el cliente, la consulta podría ejecutarse directamente en MongoDB :
var results = _collection.Find(Builders<Business>.Filter.Not( Builders<Business>.Filter.ElemMatch( x=>x.keywords, k=>!k.Name.Contains(s)))); Es un poco complicado, porque filtramos todos los valores que no (no contienen s), pero funciona. Si no tiene una gran cantidad de datos, está bien consultar Enumerable como ya se propuso.
En MongoDB, necesita usar una colección fuertemente tipada cuando llama a consultas LINQ. Por lo tanto, debe usar AsEnumerable() , esta salida de retorno como IEnumerable<out T> y podrá usar LINQ. Su consulta debería verse como
var results = Businesses.AsEnumerable().Select(x => x.ToLower()) .Where(x => keywords.All(x.Contains));