为什么这个错误发生在**?
错误:对象引用未设置为对象的实例。
public static long GetID(string str1, string str2)
{
using(MyContext db = new MyContext())
{
long Idold = db.old.FirstOrDefault(p => p.oldfield == str1).id; //**
return db.tbl_new.FirstOrDefault(p => p.id_old == Idold && p.newfield == str2).id;
}
}
当然我的tbl不是空的.i将值设置为我的tbl中存在的str1和str2。
答案 0 :(得分:2)
如果db.old.FirstOrDefault(p => p.oldfield == str1)
找不到匹配项,则null
将返回id
。您正在尝试访问{{1}}属性。当没有找到任何物品时你需要处理。
答案 1 :(得分:0)
很明显,数据库中没有与谓词匹配的记录。 FirstOrDefault()
方法返回null,当您尝试获取id
属性时,它会抛出NullReferenceException。
答案 2 :(得分:0)
当谓词解析为OrDefault
时,FirstOrDefault
的{{1}}部分返回null。
如果您的序列中没有项目确实是特殊情况,请使用false
代替First
,因为如果没有项目,FirstOrDefault
会抛出异常
但是,如果您希望序列在某些时候是空的,那么最好使用First
逻辑,然后检查FirstOrDefault
。
答案 3 :(得分:0)
可能是因为FirstOrDefault(p => p.oldFriend == str1)
返回null。换句话说,因为没有记录,oldFriend等于str1输入。
请改为尝试:
var oldFriend = db.old.FirstOrDefault(p => p.oldfield == str1);
if(oldFriend != null)
{
long Idold = oldFriend.id;
return db.tbl_new.FirstOrDefault(p => p.id_old == Idold && p.newfield == str2).id;
}
else
{
return 0;
}
答案 4 :(得分:0)
由于你没有提供堆栈跟踪,我猜你的查询中的第一行或第二行。
db.old.FirstOrDefault(p => p.oldfield == str1).Id
db.tbl_new.FirstOrDefault(p => p.id_old == Idold && p.newfield == str2).id
FirstOrDefault返回null,因为它找不到等于str2或str1变量的Id
答案 5 :(得分:0)
long Idold = db.old.FirstOrDefault(p => p.oldfield.Trim() == str1.Trim()).id;