在Linq的一些查询语句中,经常要把不等于某个值的记录查询出来,例如:数据库中有一张表:Travel,需要把Travel表中字段IsUse(string)值不等于“否”的记录查询出来。(注:字段IsUse值可以为null,查询出来的记录要求包括IsUse值为null的记录)
1.1、如以下代码1.1所示,表面看来,这是符合查询要求的。但查询出来的结果把IsUse值为null的记录过滤掉了,这往往会被我们忽略。
代码1.1
using (AttendanceCenterDataContext db = new AttendanceCenterDataContext())
{
var resultList = db.Travels.Where(p=> p.IsUse != "否").ToList();
}
1.2、如下代码1.2是我遇到类似问题时所用的解决方法。
代码1.1
using (AttendanceCenterDataContext db = new AttendanceCenterDataContext())
{
var resultList = db.Travels.Where(p=> p.IsUse == null || p.IsUse != "否").ToList();
}
对于null,使用null.contains会引发错误,因此应该先判断,例如....bz!=null && bz.contains;或者在数据库中先对null赋值为“ ”
//测试null字段可否用length=0代替,完全不能。linq本质上是sql语言,在sql语言中len(字段)与 is null结果完全不同,为null的数据,无法计算其len
/* var cx_bdjg_zy_school_zy = from aa in sjklj.zy_school_zy
where aa.pc == "本科批" && aa.bdjg.Length == 0
select aa;//当年的招生计划
this.Lbl_ts.Text = cx_bdjg_zy_school_zy.Count().ToString();
return;
*/
//先把zy_school_zy中bdjg设置为null,否则数据被重复累积
var gx_bdjg_zy_school_zy=from aa in sjklj.zy_school_zy
where aa.pc == "本科批" && !(aa.bdjg==null || aa.bdjg.Length==0)
select aa;//当年的招生计划 aa.bdjg==null || aa.bdjg.Length==0表示为null或空白字符