我正在編寫一個用戶界面,允許某人按他們的名字和/或姓氏查找用戶。例如,如果您輸入名字「Mike」和輸入姓氏「Jo」,則返回「Mike Jones」,「Mike Johnson」和「Mike Jobs」。我用下面的LINQ聲明中搜索:使用實體框架在數據庫中搜索文本
var users = (from u in context.TPM_USER
where u.LASTNAME.ToLower().Contains(LastName.ToLower())
&& u.FIRSTNAME.ToLower().Contains(FirstName.ToLower())
select u);
(有可能會或可能不會是一個更好的辦法做到不區分大小寫像條款,但這似乎工作)
問題如果用戶輸入名字或姓氏,但是然後將其他字段留空。如果我爲名字輸入「Mike」並將姓氏字段留空,我想要返回所有Mikes,而不管他們的姓氏是什麼。上述查詢不會返回任何結果,除非這兩個字段至少填充了某些內容。
我想:
var users = (from u in context.TPM_USER
where (LastName == "" || u.LASTNAME.ToLower().Contains(LastName.ToLower()))
&& (FirstName == "" || u.FIRSTNAME.ToLower().Contains(FirstName.ToLower()))
select u);
不過,我仍然沒有結果,除非這兩個字段填寫。我在調試器下驗證LastName == ""
確實如此。
UPDATE:
我做了一些更多的調試,這實際上是一個Oracle的問題。正在生成的查詢是:
--Replaced the field list with * for brevity
SELECT * FROM TPMDBO.TPM_USER "Extent1"
WHERE (('jones' = '') OR ((INSTR(LOWER("Extent1".LASTNAME), LOWER('jones'))) > 0)) AND (('' = '') OR ((INSTR(LOWER("Extent1".FIRSTNAME), LOWER(''))) > 0))
乍一看似乎是正確的。但是,Oracle似乎沒有正確地短路短語('' = '')
。實際上,如果我這樣做:
select * from TPM_USER where '' = ''
我得到零行。我不夠了解Oracle如何編寫,但這兩種方式都是實體框架方言錯誤。
謝謝!這樣可行。我有點好奇,爲什麼你必須跳過這些環節。如果沒有其他人提出涉及單個LINQ語句的更簡潔的方法,我會接受這個答案。 –
儘管這是一個Oracle問題,但我將其標記爲答案,因爲它提供了最佳的解決方法。然而,史蒂夫值得幾點確認這個*應該在SQL Server中工作。 –
對於它的價值,imo這是一種更清晰的方式:它導致最小化的LINQ語句,並且更具可讀性。另外,'IsNullOrWhiteSpace'是(我認爲)比'=='''更強大的檢查。 – JKomusin