У меня есть приложение, в котором я беру большое количество «названий продуктов», введенных пользователем, и получаю некоторую информацию о каждом продукте. Проблема в том, что пользователь может ввести частичное имя или даже неправильное имя, поэтому я хочу вернуть самые близкие совпадения для дальнейшего выбора.
По существу, если название продукта А точно соответствует записи, верните ее, в противном случае верните все найденные совпадения. В противном случае верните ноль.
Я сделал это с тремя отдельными утверждениями, и мне было интересно, есть ли более эффективный способ сделать это. Я использую LINQ to EF, но по соображениям производительности я сначала материализую продукты в список.
productNames - список наименований товаров (вводится пользователем).
продукты Список продуктов 'записей'
var directMatches = (from s in productNames
join p in products on s.ToLower() equals p.name.ToLower() into result
from r in result.DefaultIfEmpty()
select new {Key = s, Product = r});
var containsMatches = (from d in directMatches
from p in products
where d.Product == null
&& p.name.ToLower().Contains(d.Key)
select new { d.Key, Product = p });
var matches = from d in directMatches
join c in containsMatches on d.Key equals c.Key into result
from r in result.DefaultIfEmpty()
select new {d.Key, Product = d.Product ?? (r != null ? r.Product: null) };