2015-12-02 19 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

相關問題