Linq to SQL: частичные совпадения строк с использованием содержимого в массиве строк

Вот мой код:

string[] customerNames = searchModel.CustomerName.Split(',');
 query = query.Where(d => customerNames.Contains(d.CustomerName, comparer) || customerNames.Contains(d.Company1.CompanyName, comparer));

Что работает, если вы просто ищете точные совпадения. Однако я хотел бы частичное совпадение, то есть: если customerNames содержит элемент 'ell', он выберет d, если d.CustomerName был 'Hello', поскольку «ell» находится в «Hello»

Я попытался переопределить EqualityComparer, но я считаю, что он пытается использовать функцию GetHashCode, а не Equals в Comparer, которую я не уверен, как реализовать.

Как мне это сделать?


person Dave    schedule 10.02.2014    source источник


Ответы (1)


string[] customerNames = searchModel.CustomerName.Split(',');
query = query.Where(d => customerNames.Any(c => c.Contains(d.CustomerName)) || customerNames.Any(c => c.Contains(d.Company1.CompanyName)));

Но вы должны знать, что это может стать очень медленным, когда customerNames имеет много элементов.

person MarcinJuraszek    schedule 10.02.2014
comment
Я просто отвечал на это сам. Я проверю вас, когда пройдет 8 минут. В customerNames должно быть очень мало элементов, но да, я не уверен, что я могу сделать, чтобы избежать этой логики. - person Dave; 11.02.2014
comment
Будет ли он переведен в sql или будет выполняться на стороне клиента в полном объеме? - person Hamlet Hakobyan; 11.02.2014
comment
Вы можете использовать PredicateBuilder и просто добавить в свой запрос список OR условий. Что, вероятно, должно быть лучше и быстрее, чем цепочка Any+Contains. - person MarcinJuraszek; 11.02.2014
comment
@HamletHakobyan Должен быть преобразован в SQL (поэтому я удалил компаратор). - person MarcinJuraszek; 11.02.2014
comment
Дерево выражений было бы лучшим решением в этом случае. - person Hamlet Hakobyan; 11.02.2014
comment
Marcin - на самом деле это должно быть c => d.CustomerName.Contains(c), я полагаю. Однако это может быть не очевидно из того, как я сформулировал вопрос. - person Dave; 11.02.2014