2015-12-02 46 views
0

我正在为搜索写一个sql查询,用户根据FirstName和LastName进行搜索。当查找FirstName或LastName时查询工作正常,但是当我搜索FirstName和LastName(即FirstName和LastName之间的空格)时,它会给出空白结果。查询字符串看起来是这样的:
http://localhost:4562/api/User/Search?q=sumedha%20v&filters=&offset=3&limit=9如何在实体框架中使用Like运算符lamba表达式

SQL查询是:List<AppUser> searchedAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.StartsWith(q) || u.Profile.LastName.StartsWith(q)).ToListAsync();

我尝试使用Contains(),而不是StartsWith()但它仍然给出了一个空白的结果。我也试过使用SqlMethods.Like(),但在intellisense中看不到它。我尝试使用SqlFunctions.PatIndex(),但同样的问题。我试图按照this后,但力量得到如何做到这一点。
还有别的办法吗?或者我在某个地方出错了?

+0

尝试使用此查询: var searchingAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.ToLowerCase()。Contains(q.ToLowerCase())|| u.Profile.FirstName。 。ToLowerCase()包含(q.ToLowerCase()))ToListAsync();'。也许你有不同情况下的查询和数据。 –

回答

3

那么,如果您的搜索字词是“sumedha v”,很明显没有FirstNameLastName包含此字符串。你显然是在寻找这样的事情:

_context.AppUser 
     .Where(u => (u.Profile.FirstName + " " + u.Profile.LastName).Contains(q)) 

但这可能表现不佳,因为现在的查询引擎不能在名称字段中使用任何索引。如果用户不是很多(成千上万),这应该不成问题。

也许你打算在FirstNameLastName上分别使用搜索字符串的第一部分和第二部分进行搜索?就像这样:

var parts = q.Split(q, ' '); 
var q1 = parts[0]; 
var q2 = parts[1]; 
var result = _context.AppUser 
        .Where(u => u.Profile.FirstName.Contains(q1) 
         && u.Profile.LastName.Contains(q2)); 

(不含null检查)

这将有更好的表现,因为名称字段直接查询。

+0

对不起,延迟回复,但是,这是有效的。我所做的只是'_context.AppUser .Where(u => u.Profile.FirstName +“”+ u.Profile.LastName).Contains(q)'而没有实际包含'Split'部分,它会按照预期。 – sumedha

0

首先查询只检查姓:

列表searchedAppUsers =等待_context.AppUser.Where(U => u.Profile .StartsWith(Q)|| u.Profile 。 StartsWith(q))ToListAsync();其次,据我了解,你正在寻找类似“John Doe”的东西,但是FirstName(“John”)和LastName(“Doe”)都不是以“John Doe”开头(或者是就像'John Doe%)。

再想一想你的SQL会是什么。

+0

O在发布问题时犯了一个错误。我已经更新了这个问题。该查询也会检查姓氏。 – sumedha