【问题标题】:Prioritizing fields when matching multiple fields with linq使用 linq 匹配多个字段时优先考虑字段
【发布时间】:2012-10-02 22:55:35
【问题描述】:

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

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

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

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

例如,如果我要查找 Schmid,我想首先显示姓氏与 Schmid 匹配的人,然后是名字,然后是街道...等

有什么想法吗?

【问题讨论】:

  • 我想你会在这里找到你要找的东西:stackoverflow.com/questions/3760001/linq-orderby-versus-thenby
  • 是的,它很有用,但与我想要做的不完全匹配。假设您有 schmid(firstname) arnaud (lastname), john schmid, alex schmid 那么第一个将是 schmid arnaud,我希望第一个是 alex schmid 然后 john schmid ..etc 我想将 schmid 显示为名字首先然后作为姓氏...等
  • 啊,我明白你的意思了。对于字符串搜索,您要匹配多个字段,并且希望首先匹配某些字段。

标签: linq search entity-framework-4


【解决方案1】:

希望我理解正确

var res = 
    folders
        .Where(item => item.FirstName == name)
        .Union(folders.Where(item => item.LastName == name))
        /* Add more Union-Where statements */
        ;

【讨论】:

  • 是的,非常感谢,这真的很好。但如果你明白我的意思,我也需要休息。我可以添加这个: res = res.Union(folders.Except(res)) 但它很丑......你有更好的主意吗?
  • 只是联合 resfolders ...联合将区分集合
【解决方案2】:

我认为最好的方法是先获取匹配的对象,然后在内存中进行:

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. ...

如果您在IQueryable 上执行所有OrderBy,则查询可能会失败,而初始过滤器是使用数据库引擎最重要的事情。

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

【讨论】:

  • 感谢您的回答,我不明白为什么,但是当我尝试时这该死的慢
  • 可能是因为所有 lambda 表达式都针对列表中的每个项目运行,所以需要大量数据处理。毕竟,具有更长查询的完整数据库引擎解决方案(没有ToArray)可能更好。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 2019-09-20
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多