如何构造 LINQ 查询以针对另一个列表测试列表,其中元素以另一个列表的元素开头



基本上,我正在构建一个自动完成文本框来搜索名称片段。(是的,可以使用Lucene等,但由于许多非技术原因,没有使用它)

public IEnumerable<ContactAutoComplete> SelectActiveContactsAutoCompleteForMailingList(string fullName)
  {
    //Search query fullname e.g. James Francis Cameron is decomposed 
    //into a list comprising James, Francis, Cameron
      IEnumerable<string> fragment = fullName.Trim().Split();
      return _db.Contacts.Where(contact => contact.Status == Statuses.Activated &&
      (fragment.All(c => contact.FullName.Trim().Split().Any(frag => 
      frag.StartsWith(c))
  }

在上述上下文中,我需要的是一个子句

  • .Trim().Split()应用于每个联系人的"全名"字段

  • 测试获取的文本片段列表(联系。FullName.Trim.Split)针对从搜索查询获取的文本片段(片段)

  • 检查每个文本片段(片段)是否会出现在从contact.FullName.Trim.Split获取的每个片段的开头

例子:在数据库中,联系人的全名是詹姆斯·弗朗西斯·卡梅伦

正在搜索"Fra Cam" - OK

"Cam Fra" - OK(因为在亚洲,名称排序约定不一致)

"顺式罗恩" - 不行

非常感谢!

Linq 无法将 string.Split() 等方法转换为 SQL,因此您不能像这样以超通用的方式执行此操作,并且在执行查询时无法轻松地将全名拆分为两个字段。如果您在名字和姓氏的两个字段中有您的姓名,您可以这样做:

var fragments = fullName.Split(' ');
var first = fragments.FirstOrDefault().Trim();
var last = fragments.Skip(1).FirstOrDefault().Trim();
var r = db.Contacts.Where(x => (x.First.StartsWith(first) && x.Last.StartsWith(last)) 
    ||  (x.First.StartsWith(last) && x.Last.StartsWith(first)) 
);

最新更新