代码之家  ›  专栏  ›  技术社区  ›  B.Termeer

使用LINQ基于三列搜索全名

  •  3
  • B.Termeer  · 技术社区  · 8 年前

    我正在尝试在Visual Studio中使用LINQ创建一个搜索方法。在我的数据库中,我有三个字段“Firstname”、“lastnameprifix”和“Lastname”。我的搜索字符串是Searchtext。如何进行搜索所有字段的简单LINQ查询?

    目前我拥有的是:

    query = query.Where(x => x.FirstName.Contains(input.SearchText) || x.LastNamePrefix.Contains(input.SearchText) || x.LastName.Contains(input.SearchText));
    

    有了这个,我非常接近解决方案,但当我尝试将Firstname与lastnameprifix和Lastname结合起来时,我没有得到任何结果。

    例如,名称为Jan van Lauw:

    I search Jan. It works
    I search van. It works
    I search Lauw. It works
    I search Jan van Lauw. No results. 
    

    我尝试使用以下函数创建一列,将三列合并为全名:

    public static string CreateFullname(string firstName, string lastNamePrefix, string lastName)
    {
        return $"{firstName} {lastNamePrefix} {lastName}".Replace("  ", " ").Trim();
    }
    

    如果我尝试像下面的代码那样使用此列,则会出现以下错误: LINQ to实体中不支持指定的类型成员“FullName”。仅支持初始值设定项、实体成员和实体导航属性。

    query = query.Where(x => x.FullName.Contains(input.SearchText));
    

    如何在多个列中搜索?

    3 回复  |  直到 8 年前
        1
  •  5
  •   Evk    8 年前

    不能使用自定义(未映射)属性,如 FullName ,但您可以内联组合属性:

    query.Where(x => (x.FirstName.Trim() + " " + x.LastNamePrefix.Trim() + " " + x.LastName.Trim()).Trim().Contains(input.SearchText));
    
        2
  •  1
  •   Yeldar Kurmangaliyev    8 年前

    使用计算属性时,LINQ to实体无法生成查询。 尝试在查询中使用就地字符串连接。

    我不确定LINQ to Entities是否能够将此表达式转换为SQL“like”查询,但我在实体框架中使用了这种方法。

    query = query
        .Where(x => (x.FirstName + " " + x.LastNamePrefix + " " + x.LastName).Contains(input.SearchText));
    

    您可以将两个或多个查询组合在一起,以使搜索更加灵活:

    query = query
        .Where(x => (x.FirstName + " " + x.LastNamePrefix + " " + x.LastName).Contains(input.SearchText) 
                  || (x.FirstName + " " + x.LastName).Contains(input.SearchText));
    
        3
  •  0
  •   Tom Mendelson    8 年前

    您建议将名称合并为全名并删除“”的建议是错误的, 这就是为什么:

    搜索文本 :“abc”

    名字 :“ab”

    LastNamePrefix :“c”

    姓氏 :'无所谓'

    您希望的结果是错误的,因为名字或姓氏前缀和姓氏中没有“abc”,但在您的建议中,它将被接受。

    如果按3个参数搜索,则必须比较这些参数