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

时间:2017-10-31 03:35:15

标签: c# 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字段

  • 根据从搜索查询中获取的文本片段(片段)测试获取的文本片段列表(contact.FullName.Trim.Split)

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

实施例: 在数据库中,联系人拥有FullName,James Francis Cameron

正在搜索 “Fra Cam” - 好的

“Cam Fra” - 好的(因为在亚洲,名称排序惯例不一致)

“Cis Ron” - 不行

非常感谢!

1 个答案:

答案 0 :(得分:0)

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)) 
);