2017-04-17 65 views
0

我有这段旨在搜索数据库的代码。用户在这里应该有3个选项:只输入姓氏,名字和用户可以使用他们的姓氏和名字进行搜索。搜索中的非必填字段

如果我同时提供字符串 - 姓氏和名字,此代码将从我的数据库中检索记录。但是如果我只输入其中的一个,我的结果列表总是空的。

var query = from x in db.people 
        where (txtSurname == null || x.Surname== txtSurname.Text) 
         && (txtFirstName == null || x.FirstName == txtFirstName.Text) 
        select x; 
     var data = query.ToList(); 
     peopleBindingSource.DataSource = data; 

回答

5

记住,直到兑现的数据问心无愧ToList或遍历它的例子,实体框架查询不会被发送到数据库。这意味着您可以使用如下代码构建查询:

var query = db.people.AsQueryable(); 

if(!string.IsNullOrEmpty(txtSurname.Text)) 
{ 
    query = query.Where(p => p.Surname == txtSurname.Text); 
} 

if(!string.IsNullOrEmpty(txtFirstName.Text)) 
{ 
    query = query.Where(p => p.FirstName == txtFirstName.Text); 
} 

peopleBindingSource.DataSource = query.ToList(); 
+1

使用此方法也可能会生成更好的缓存查询计划。由于参数嗅探来自先前运行的大多数未使用的字段,因此您不会收到错误的索引。 –

+0

如果在问题中进行比较检查,则这不完全相同。如果(txtSurname == null),你只是检查是否(txtSurname.Text)。 – David

+0

@大卫是的,但我怀疑这是造成原始问题的错字。 – DavidG