Mik*_*sen 3 .net c# linq oracle entity-framework
我正在编写一个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);
Run Code Online (Sandbox Code Playgroud)
(可能有或没有更好的方法来做一个不区分大小写的类似条款,但这似乎有效)
问题是如果用户键入名字或姓氏,但随后将另一个字段留空.如果我输入"Mike"作为名字并将Last Name字段留空,我想要返回所有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);
Run Code Online (Sandbox Code Playgroud)
但是,除非两个字段都填写完毕,否则我仍然没有结果.我已经在调试器下验证了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))
Run Code Online (Sandbox Code Playgroud)
乍一看似乎是正确的.然而,甲骨文似乎并没有正确地短路的短语('' = '').事实上,如果我这样做:
select * from TPM_USER where '' = ''
Run Code Online (Sandbox Code Playgroud)
我得零行.我没有足够的甲骨文专家知道这个查询怎么应该写,但无论哪种方式,它是一个实体框架方言错误.
只需有条件地添加谓词:
var users = from u in context.TPM_USER select u;
if (!string.IsNullOrWhiteSpace(FirstName))
users = users.Where(u => u.FIRSTNAME.ToLower().Contains(FirstName.ToLower()));
if (!string.IsNullOrWhiteSpace(LastName))
users = users.Where(u => u.LASTNAME.ToLower().Contains(LastName.ToLower()));
Run Code Online (Sandbox Code Playgroud)
或者只将LASTNAME谓词作为条件谓词.
| 归档时间: |
|
| 查看次数: |
7303 次 |
| 最近记录: |