MongoDB C # Использование пользовательских расширений в Linq или Lambda Query для проверки сходства строк - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь получить из коллекции Mongo только то, что "x.SystemName" на 80% похоже на входную строку. Это работает, когда я загружаю все записи из коллекции в переменную, но я хочу получать результаты непосредственно из базы данных.

Этот код работает:

IEnumerable<Company> companies = await FindAllCompanies();
IEnumerable<Company> _dbresult = (from company in companies
                                           where company.SystemName.StringRateSimilarity(inputSystemName) >= 0.8 || company.SystemName.Contains(inputSystemName) || company.Name.ToLowerInvariant().Contains(name.ToLowerInvariant())
                                           select company);

Но я хочу сделать это без предварительной загрузки всех компаний в переменную:

IEnumerable<Company> _dbresult = (from company in _db.DatabaseHost.GetCollection<Company>(collectionName).AsQueryable()
                                           where company.SystemName.StringRateSimilarity(inputSystemName) >= 0.8 || company.SystemName.Contains(inputSystemName) || company.Name.ToLowerInvariant().Contains(name.ToLowerInvariant())
                                           select company);

или как это:

var collection = _db.DatabaseHost.GetCollection<Company>(collectionName);
IEnumerable<Company> _dbresult = collection.AsQueryable().Where(x => (Services.API.StringRateSimilarity(x.SystemName, inputSystemName) >= 0.8) || (x.SystemName.Contains(inputSystemName)) || (x.Name.ToLowerInvariant().Contains(name.ToLowerInvariant()))).Select(e => e);

Но это делает InvalidOperationException: StringRateSogeneity ({document} {systemName}, "TEST") не поддерживается. Ошибка

1 Ответ

0 голосов
/ 11 мая 2018

Чтобы драйвер MongoDB C # мог преобразовать выражение C # в запрос MongoDB, ему необходимо «знать», как это сделать.С вашим рукописным методом драйвер не сможет узнать, что делает ваш метод, и, следовательно, как MongoDB может сделать то же самое на стороне базы данных (что может или не может быть возможно).

Я бы предложил вамРешите эту проблему с другой стороны:

  1. Попробуйте выразить свою логику "80% сходства", используя чистый запрос MongoDB.
  2. Переведите этот запрос MongoDB в C #, используя только встроенныйв строковых функциях, которые поддерживаются драйвером C # или альтернативно прибегают к отправке этого необработанного запроса MongoDB в виде строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...