我有一个数据库,其中包含firstname lastname street和searchfield等字段。任何与搜索字段匹配的东西都在我的搜索子集中,这里是linq逻辑:
if (!String.IsNullOrEmpty(searchString))
{
folders = folders.Where(p => p.SearchField.ToLower().Contains(searchString.ToLower()));
}
我可以通过名字或名字或其他任何方式订购。
现在我想展示结果,以便它根据我的搜索字词优先考虑名称字段。
例如,如果我寻找施密德,我想首先展示姓氏与施密德相匹配的人,然后是第一个名字然后是街道...等等
有什么想法吗?
答案 0 :(得分:3)
我希望我理解正确
var res =
folders
.Where(item => item.FirstName == name)
.Union(folders.Where(item => item.LastName == name))
/* Add more Union-Where statements */
;
答案 1 :(得分:1)
我认为最好的方法是首先获取匹配的对象,然后在内存中继续:
var lower = searchString.ToLower();
folders = folders
.Where(p => p.SearchField.ToLower().Contains(lower))
.ToArray();
folders = folders
.OrderBy(f => !f.LastName.Contains(lower))
.ThenBy(f => !f.FistName.Contains(lower))
.ThenBy(f => !f. ...
如果您对OrderBy
执行IQueryable
所有操作,查询可能会爆炸,而初始过滤器是使用数据库引擎最重要的事情。
请注意,您无法始终在lower
和中显示与LastName
匹配的项目,然后在FistName
等匹配的项目,因为可能存在两者都匹配的项目。我不认为你想复制项目,是吗?