2013-06-04 36 views
4

我从数据库中检索数据与拉姆达像如何验证是否拉姆达查询返回null

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

其实,在MyTable,有2个没有ID。
所以我收到了这条消息。

未将对象引用设置为对象的实例。

如何正确验证它?

回答

12

刚刚捕获查询的结果为独立的变量,并检查是否有任何项目访问其属性之前发现:

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

问题解决!谢谢lazyberezovsky :) – zey

+1

@zey我已经添加了一个选项 - 如果你只需要一个属性从你的对象,那么你可以在服务器端投影结果 –

2

你必须先检查返回值是零,然后访问:

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

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

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

0
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).ToArray() 
if( yourItem.Length > 0) 
    //do stuff 
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; 

The con DefaultIfEmpty的切片很简单:它用一个默认值的集合替换一个空集合。

int的默认值为0.因此,List上的DefaultIfEmpty产生一个具有一个零元素的List。

希望它有帮助。

+0

注意'string.Empty'作为“默认值”对象isn'不会有'MyColumn'属性。这种情况下的缺省值需要是'MyTable'表中表示的类型的对象。 –

3

另一种方法是使用"null-coalescing" ?? operator,如果第一个参数为null,将使用第二个参数。

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

+0

+ 1使用空合并运算符... –

+0

使用'DefaultIfEmpty(defaultValue)'(如@Microtechie建议的)是一种更加优雅(易于理解)的方式来做同样的事情。有些地方'??'是非常有用的,但这不是其中之一。 –

+0

嗨@MosheKatz在尝试我的答案之前,我尝试过'DefaultIfEmpty(defaultValue)',它不起作用? – Dannyh