我在webapi中使用通过Linq过滤数据,但是出现如下问题:代码如下:
如果红色部分,students不为空,一切正常。但是如果students 为空,则会在return Ok(models.FirstOrDefault());的时候报System.NullReferenceException 异常。求解决。
相关代码:
var models = db.tb_Account.Where(a => a.username == username && a.password == password).Select(e => new
{
e.id,
e.address,
e.age,
e.imgurl,
e.nickName,
e.password,
e.username,
e.weixin,
students=db.View_Student.Where(s=>s.guardianId==e.id)
});
if (models.Count() > 0)
return Ok(models.FirstOrDefault());
问题是这样的:我自己创建了视图,显示学生信息,来自多个表。刚开始一切正常,后来多添加了几条数据后发现红色代码部分报System.NullReferenceException 错误,而且已经获取到数据,因为models 的count属性>0。一直以为是我修改了哪部分代码导致的。
原因:因为我创建的视图,没有添加索引,而且任何一列都不唯一的,都有可能出现重复的值。刚开始,数据少,WebApi会自定根据你的数据默认一个列作为索引列。后来,添加了数据之后,每一列都有重复的值,WebApi无法自动识别了,就报错了,而且FirstOrDefault等方法也无法使用。
解决:只需修改视图,添加一列不会重复的列即可,我加上了Id列,就搞定了。
多次尝试,证明,是因为View_student是由sql中视图生成的,求解决办法。
ok是啥?
var models = db.tb_Account.Where(a => a.username == username && a.password == password).Select(e => new { e.id, e.address, e.age, e.imgurl, e.nickName, e.password, e.username, e.weixin, students=db.View_Student.Where(s=>s.guardianId==e.id) }).FirstOrDefault(); if (models != null) return Ok(models);
改成这样,错误出在哪儿。
也是一样,是因为Vew_Studnet 为视图生成的类。如果数据表则一起正常。怎么回事呢
@yuexingchen2: 什么叫也是一样?
我问你错误出在哪一行上。
是FirstOrDefault还是Ok上。
if (queryOne.Any())
{
}
试试这样判断
建议将代码逻辑拆分开,搞清楚到底是那句代码错误。