代码之家  ›  专栏  ›  技术社区  ›  sagi

EF核心综合体

  •  0
  • sagi  · 技术社区  · 7 年前

    searchQuery . 我有一个客户表,格式如下:

    id | empId | empName | personId | personFirstName | personLastName
    

    请注意,客户要么是雇主,要么是个人,而不是两者兼而有之(相应的字段将为空)。这是我正在使用的查询:

    collectionBeforePaging = _context.Customers
        .Where(a => (a.Employer == null ? (a.Person.FirstName.Contains(searchQueryForWhereClause) ||
                                           a.Person.LastName.Contains(searchQueryForWhereClause) ||
                                           a.PersonId.ToString().Contains(searchQueryForWhereClause))
                                        : (a.Employer.Name.Contains(searchQueryForWhereClause) ||
                                           a.EmployerId.ToString().Contains(searchQueryForWhereClause))));
    

    这工作,虽然不是我想要的。如果用户搜索“Jhon Pots”,并且客户是个人,那么它将检查名字是否包含“Jhon Pots”或姓氏是否包含“Jhon Pots”,而不是检查名字是否包含“Jhon”,姓氏是否包含“Pots”。

    我能控制 firstName lastName ,但它必须是完全匹配的(即,它不会匹配名为“Jhon S。罐“)

    我还考虑过使用 Split 方法,但我不知道如何正确地将其与EF Where子句组合(我不能对每个字符串使用foreach循环和过滤器,因为它将按每个字符串过滤结果,而不是使用 OR 逻辑运算符)

    有人知道我怎样才能做到这一点吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Chris Pratt    7 年前

    您需要首先拆分字符串,然后根据结果数组中的任何项是否与每个字段匹配进行查询:

    var keywords = searchQuery.Split(' ');
    

    然后:

    collectionBeforePaging = _context.Customers
        .Where(a => a.Employer == null
            ? keywords.Any(k => 
                a.Person.FirstName.Contains(k) ||
                a.Person.LastName.Contains(k) ||
                a.PersonId.ToString().Contains(k))
             : keywords.Any(k =>
                a.Employer.Name.Contains(k) ||
                a.EmployerId.ToString().Contains(k)));
    
        2
  •  2
  •   kaffekopp    7 年前

    EF.Functions.Like()

    使用空格作为分隔符拆分搜索项,迭代搜索项并在执行之前向查询中添加where子句:

    string[] searchTerms = searchQueryForWhereClause.Split(' ');
    
    var query = _context.Customers.AsQueryable();
    foreach (string searchTerm in searchTerms)
    {
        query = query.Where(x => EF.Functions.Like(x.FirstName, $"%{searchTerm}%"
            || EF.Functions.Like(x.LastName, $"%{searchTerm}%"
            || EF.Functions.Like(x.PersonId, $"%{searchTerm}%"
            || EF.Functions.Like(x.Employer.Name, $"%{searchTerm}%"
            || EF.Functions.Like(x.EmployerId, $"%{searchTerm}%");
    }
    
        3
  •  1
  •   Flexicoder    7 年前

    推荐文章