4

我用 lambda 从数据库中检索数据

 var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn;

实际上,在MyTable2 中没有 ID。
所以我得到了这个消息。

你调用的对象是空的。

如何正确验证它?

4

5 回答 5

13

只需将查询结果捕获到单独的变量中,并在访问其属性之前检查是否找到任何项目:

var yourItem = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (yourItem != null)
    obj = yourItem.MyColumn;

顺便说一句,您可以将谓词传递给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();
于 2013-06-04T12:45:04.117 回答
3

另一种方法是使用“null-coalescing”??运算符,如果第一个参数为空,它将使用第二个参数。

var obj = (DBContext.MyTable.FirstOrDefault(x => x.ID == 2) ?? new MyTable()).MyColumn;

于 2014-01-10T05:32:26.053 回答
2

您必须先检查返回值是否为空,然后访问它:

var temp = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();

if (temp != null)
{
    var obj = temp.MyColumn;
}

不是最优雅的方式,但我不知道其他方式。

于 2013-06-04T12:46:13.540 回答
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。

希望能帮助到你。

于 2013-06-04T13:15:30.520 回答
0
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).ToArray()
if(    yourItem.Length > 0)
   //do stuff
于 2013-06-04T12:49:13.823 回答