使用linq匹配多个字段时优先考虑字段

时间:2012-10-02 13:46:16

标签: linq search entity-framework-4

我有一个数据库,其中包含firstname lastname street和searchfield等字段。任何与搜索字段匹配的东西都在我的搜索子集中,这里是linq逻辑:

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

我可以通过名字或名字或其他任何方式订购。

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

例如,如果我寻找施密德,我想首先展示姓氏与施密德相匹配的人,然后是第一个名字然后是街道...等等

有什么想法吗?

2 个答案:

答案 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等匹配的项目,因为可能存在两者都匹配的项目。我不认为你想复制项目,是吗?