我正在编写一个 UI,允许某人通过他们的名字和/或姓氏查找用户。例如,如果您输入“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);
(可能有也可能没有更好的方法来执行不区分大小写的like子句,但这似乎有效)
问题是如果用户输入名字或姓氏,但随后将其他字段留空。如果我输入“迈克”作为名字并将姓氏字段留空,我想返回所有迈克,而不考虑他们的姓氏。上面的查询不返回任何结果,除非两个字段都至少填写了一些东西。
我试过:
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 == ""
确实如此。
更新:
我做了更多的调试,这实际上是一个 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 专家知道应该如何编写此查询,但无论哪种方式,它都是实体框架方言错误。