基本上,我正在构建一个自动填充文本框来搜索名称片段。 (可以使用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” - 不行
非常感谢!
答案 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))
);