2015-08-11 4 views
0

У меня есть список строк IEnumerable<string> companies , содержащие компании i.e. mcdonalds, sony inc.linq-to-query и содержит для IEnumerable <string>?

Я хочу сравнить со значениями в базе данных. Я хватаю список из базы данных и в цикле Еогеасп я сравниваю

if (companies.Any(c => c.Contains(name.ToLower()))) 
{...} 

в базе данных у меня есть компании, т.е. Макдоналдс вкл, сони

при поиске с помощью «сони» он находит его. Когда я ищу, используя «mcdonalds inc», это не так. из-за дополнительного слова «inc»

Я знаю, что сравниваю company.any (содержит (mcdonalds inc)), и он не находит его.

Любая предполагая о том, как я могу продлить, если условие также сравнить с помощью стиха

+0

Вы уверены, что место в 'mcdonalds inc' на самом деле является пространством? Код, который вы опубликовали, должен работать так, как вы ожидаете, хотя я бы сделал ставку на лучшее решение. –

+1

Возможно, вам придется отфильтровать список в памяти. Не существует синтаксиса SQL, чтобы узнать, начинается ли значение с любого значения в списке, не вставляя его в несколько условий (например, 'WHERE x LIKE 'mcdonalds%' ИЛИ ​​x LIKE 'sony%' OR ...' или делать соединение в таблицу in-memory, ни одна из которых не поддерживается Linq-to-SQL) –

ответ

0

Почему бы не сравнить список строк с базой данных, а не в базе данных с вашим списком?

foreach(var name in list) 
{ 
    if(table.Any(t => SqlMethods.Like(name, string.Format("%{0}%", t.Column)) 
    { ... 
    } 
} 

Это приведет к различиям, когда имена будут широко, но не точно такими же.

0

Вы можете вызвать Split, прежде чем сравнивать и сравнивать только первый элемент в списке. В этом случае вы всегда отказываетесь от «inc». Это, конечно, будет работать только в том случае, если ваша проблема возникает только потому, что у вас могут быть суффиксы, которые необходимо отменить.

0

Это зависит от того, насколько вам нечеткой нужна ваша строка. Вы, вероятно, не можете просто удалить все вхождения inc из строки, например, потому что потенциально может пострадать компания под названием «Inc inc» или «Inception».

Для вашего конкретного примера вам в основном нужно отделить некоторые термины (скажем, inc, embedded и llc) от конца строки. Давайте также скажем, что в конце строки может быть больше одного члена. Вы потенциально можете сделать это с помощью регулярных выражений, что-то вроде

Regex termRemover = new Regex("^(?<companyName>.*?)(\\s+(inc|incorporated|llc))*$"); 

, которые затем могут быть использованы в вашем примере, как

string scrubbedName = termRemover.Match(name.ToLower()).Groups["companyName"].Value; 
    if (companies.Any(c => c.Contains(scrubbedName))) 
    {...} 

(плюс проверка ошибок и т.д., упал здесь для краткости). Список компаний должен быть очищен таким же образом до использования; иначе ваш sony inc никогда не будет соответствовать чему-либо, что скроет только сони.

Смежные вопросы