Существует ли в LINQ эффективный способ использовать совпадение в том и только в том случае, если нет точного совпадения? - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть приложение, в котором я беру большое количество «названий продуктов», введенных пользователем, и получаю некоторую информацию о каждом продукте. Проблема в том, что пользователь может ввести частичное имя или даже неправильное имя, поэтому я хочу вернуть самые близкие совпадения для дальнейшего выбора.

По существу, если название продукта А точно соответствует записи, верните ее, в противном случае верните все найденные совпадения. В противном случае верните ноль.

Я сделал это с тремя отдельными утверждениями, и мне было интересно, есть ли более эффективный способ сделать это. Я использую 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) };

1 Ответ

1 голос
/ 23 декабря 2010

Если у вас есть небольшой или средний список в памяти, взгляните на LiquidMetal и для фонетических совпадений алгоритм Soundex для ранжирования ближайших соответствий. *

Если вы используете SQL Server, изучите Полнотекстовый поиск , который используется переполнением стека. В противном случае здесь - это то, как я реализовал поиск по ключевым словам.

...