我使用lambda像
从数据库中检索数据 var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn;
实际上,在MyTable
中,没有ID为2
所以我收到了这条消息。
对象引用未设置为对象的实例。
如何正确验证?
答案 0 :(得分:13)
只需将查询结果捕获到单独的变量中,并在访问其属性之前检查是否找到任何项目:
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (yourItem != null)
obj = yourItem.MyColumn;
BTW你可以将谓词传递给SingleOrDefault
方法:
var yourItem = DBContext.MyTable.SingleOrDefault(x => x.ID == 2);
您也可以在应用SingleOrDefault
var obj = DBContext.MyTable.Where(x => x.ID == 2)
.Select(x => x.MyColumn)
.SingleOrDefault();
答案 1 :(得分:3)
另一种方法是使用"null-coalescing" ??
operator,如果第一个参数为null,它将使用第二个参数。
var obj = (DBContext.MyTable.FirstOrDefault(x => x.ID == 2) ?? new MyTable()).MyColumn;
答案 2 :(得分:2)
如果返回值为null,则必须首先检查,然后访问它:
var temp = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (temp != null)
{
var obj = temp.MyColumn;
}
不是最优雅的方式,但我不知道任何其他方式。
答案 3 :(得分:1)
我更喜欢DefaultIfEmpty()而不是.FirstOrDefault()
通过这样做我们可以避免检查
例如
var obj = DBContext.MyTable.Where(x => x.ID == 2).DefaultIfEmpty().MyColumn;
或
var obj = DBContext.MyTable.Where(x => x.ID == 2).DefaultIfEmpty(string.Empty).MyColumn;
DefaultIfEmpty的概念很简单:它用一个默认值的集合替换空集合。
int的默认值为0.因此,List上的DefaultIfEmpty产生一个零元素的List。
希望它有所帮助。
答案 4 :(得分:0)
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).ToArray()
if( yourItem.Length > 0)
//do stuff