2012-07-11 156 views
1

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

而且在我的代码我试图让这些细节,如,

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)) 
     { 
      // 
     } 

,在这里,如果我在电子邮件中或在Name文本框中键入sham,它列出了所有可用的学生信息的数据库,而不是列出只有学生姓名或电子邮件包含sham

当我在调试这个,我试图给了姓名,手机和电子邮件,其完美的上市,也是相同的值sham,sham,sham如果我想通过一个包含sham名称进行搜索,如果我输入名称sham,以及任何其他在电子邮件和移动,这也工作完美....

我从这个知道的一件事是,它期望所有的参数应该有一些价值,我不知道为什么这样期望这样,我不知道如何解决这个问题,任何人都可以帮助我。在此先感谢

+0

把更多的代码放在你的问题。问题可能在其他地方。 – Jones 2012-07-11 11:19:09

+0

只是简单地使用这个代码 – shanish 2012-07-11 11:34:50

+0

做其他学生有一个空的手机或电子邮件?问题是,如果你不打字电子邮件加法器,它会挑选所有学生,而不输入电子邮件 – davee 2012-07-11 11:42:35

回答

3

也许,每个字符串“包含”一个空字符串,所以如果某些文本框是空的,一些“或”条件将返回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到实体,我发现在我自己的代码查询使用它没有问题,所以更好的解决方案,以检查空字符串和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)) 
{ 
    // 
} 
+0

你真棒Slauma,它的工作完美,非常感谢 – shanish 2012-07-11 12:35:39