-3

嗨为什么这个错误发生在**?

错误:对象引用未设置为对象的实例。

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 不是空的。我将值设置为我的 tbl 中存在的 str1 和 str2。

4

6 回答 6

2

如果没有找到匹配的项目,该方法db.old.FirstOrDefault(p => p.oldfield == str1)将返回。null您立即尝试访问该id属性。没有找到物品时需要处理。

于 2013-08-06T14:09:44.660 回答
0

很明显,您的数据库中没有与谓词匹配的记录。FirstOrDefault()方法返回 null,当您尝试获取id属性时,它会抛出 NullReferenceException。

于 2013-08-06T14:10:17.113 回答
0

当谓词解析为 时,的OrDefault部分FirstOrDefault返回 null false

如果你的序列中没有项目确实是一个例外情况,那么使用First代替FirstOrDefault,因为First如果没有项目将引发异常。

但是,如果您希望序列在某些时候为空,那么您最好使用FirstOrDefault逻辑然后检查null.

于 2013-08-06T14:10:26.777 回答
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;
}
于 2013-08-06T14:10:33.300 回答
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

于 2013-08-06T14:11:05.787 回答
0

谢谢大家。我的好朋友,你是对的。我使用了 Trim() 并工作了。

     long Idold = db.old.FirstOrDefault(p => p.oldfield.Trim() == str1.Trim()).id;
于 2013-08-06T16:41:50.890 回答