2

我有一个数据库,其中包含名字姓氏街道和搜索字段等字段。与搜索字段匹配的任何内容都将在我的搜索子集中,这是 linq 逻辑:

if (!String.IsNullOrEmpty(searchString))
{
  folders = folders.Where(p => p.SearchField.ToLower().Contains(searchString.ToLower()));
}

我可以按姓名或名字或其他方式订购它。

现在我想展示结果,以便它优先考虑与我的搜索词相关的名称字段。

例如,如果我寻找施密德,我想首先显示姓氏与施密德匹配的人,然后是名字,然后是街道……等等

任何想法 ?

4

2 回答 2

3

我希望我理解正确

var res = 
    folders
        .Where(item => item.FirstName == name)
        .Union(folders.Where(item => item.LastName == name))
        /* Add more Union-Where statements */
        ;
于 2012-10-02T14:41:34.953 回答
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. ...

如果您对查询执行所有操作,OrderByIQueryable可能会爆炸,而初始过滤器是使用数据库引擎最重要的事情。

请注意,您不能总是先显示匹配的项目,lower然后LastName显示匹配的项目FistName等,因为可能存在两者都匹配的项目。我认为您不想复制项目,是吗?

于 2012-10-02T14:52:19.390 回答