使用Entity Framework在数据库中搜索文本

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)

我得零行.我没有足够的甲骨文专家知道这个查询怎么应该写,但无论哪种方式,它是一个实体框架方言错误.

Ger*_*old 9

只需有条件地添加谓词:

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谓词作为条件谓词.