如何验证lambda查询是否返回null

时间:2013-06-04 12:44:01

标签: c# linq lambda

我使用lambda像

从数据库中检索数据
 var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn;

实际上,在MyTable中,没有ID为2 所以我收到了这条消息。

  

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

如何正确验证?

5 个答案:

答案 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