使用EntityFramework进行搜索

时间:2012-07-11 10:47:47

标签: c# linq entity-framework

我试图用他们的名字或电子邮件或手机搜索学生的详细信息。为此,我有三个名称,电子邮件和移动文本框。

在我的代码中,我试图获得这些细节,

DataObject entities=new DataObject();

foreach (DataObject.Student student in entities.students.Where(p => 
          (p.FIRSTNAME+p.LASTNAME).Contains(txtName.Text)
          || p.MOBILE.Contains(txtMobile.Text)
          || p.EMAIL.Contains(txtEmail.Text))
        {
            //
        }

并且在这里,如果我在电子邮件或姓名文本框中键入sham,则列出数据库中可用的所有学生详细信息,而不是仅列出学生姓名或电子邮件,其中包含sham。< / p>

当我调试这个时,我尝试为名称,移动设备提供相同的值sham,sham,sham,并完美地通过电子邮件发送其列表,如果我想按名称搜索包含sham,并且如果我在名称中键入sham,在电子邮件和移动设备中输入任何其他内容,这也可以完美运行....

我从中得知的一点是,它希望所有的参数都应该有一些价值,我不知道为什么这样的预期,我不知道如何解决这个问题,任何人都可以帮助我。提前致谢

1 个答案:

答案 0 :(得分:3)

也许,每个字符串“包含”一个空字符串,因此如果某些文本框为空,则某些“OR”条件将为每个学生姓名返回true,并且您将获得所有学生。尝试将查询更改为:

foreach (DataObject.Student student in entities.students.Where(p => 
         ((txtName.Text != string.Empty)
             ? (p.FIRSTNAME+p.LASTNAME).Contains(txtName.Text)
             : false)
      || ((txtMobile.Text != string.Empty)
             ? p.MOBILE.Contains(txtMobile.Text)
             : false)
      || ((txtEmail.Text != string.Empty)
             ? p.EMAIL.Contains(txtEmail.Text)
             : false))
{
    //
}

除了XXX.Text != string.Empty,您还可以尝试string.IsNullOrEmpty(XXX.Text)来抓住null案例。但我不确定LINQ to Entities是否会接受这种方法。

修改

string.IsNullOrEmpty(XXX.Text)与LINQ to Entities一起工作,我在我自己的代码中发现了一个使用它而没有问题的查询,因此检查空字符串和null的更好解决方案是:

foreach (DataObject.Student student in entities.students.Where(p => 
         (!string.IsNullOrEmpty(txtName.Text)
             ? (p.FIRSTNAME+p.LASTNAME).Contains(txtName.Text)
             : false)
      || (!string.IsNullOrEmpty(txtMobile.Text)
             ? p.MOBILE.Contains(txtMobile.Text)
             : false)
      || (!string.IsNullOrEmpty(txtEmail.Text)
             ? p.EMAIL.Contains(txtEmail.Text)
             : false))
{
    //
}