【问题标题】:Linq to SQL: Partial matching strings using contains on an array of stringsLinq to SQL:在字符串数组上使用包含的部分匹配字符串
【发布时间】:2024-05-16 05:15:02
【问题描述】:

这是我的代码:

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

如果您只是在寻找精确匹配,这很有效。但是我想部分匹配,即:如果 customerNames 包含一个元素 'ell',如果 d.CustomerName'Hello',它将选择 d,因为 'ell' 在 'Hello' 中

我尝试覆盖 EqualityComparer,但我相信它正在尝试使用 GetHashCode 函数而不是比较器中的 Equals,我不确定如何实现。

我该怎么办?

【问题讨论】:

  • GetHashCode 不能保证防止冲突,因此您可以确定还有更多的事情发生。

标签: c# .net linq linq-to-sql iequalitycomparer


【解决方案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 有很多项目时,它可能会变得很慢。

【讨论】:

  • 我只是在自己回答这个问题。 8 分钟后我会检查你。 customerNames 应该是很少的项目,但是我不确定我能做些什么来避免这种逻辑。
  • 是翻译成sql还是在客户端完整执行?
  • 您可以使用PredicateBuilder 并将OR 条件列表添加到您的查询中。哪个应该比Any+Contains链更好更快。
  • @HamletHakobyan 应该转换为 SQL(这就是我删除比较器的原因)。
  • 在这种情况下,表达式树会是更好的解决方案。
最近更新 更多