我从数据库中检索数据与拉姆达像如何验证是否拉姆达查询返回null
var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn;
其实,在MyTable
,有2个没有ID。
所以我收到了这条消息。
未将对象引用设置为对象的实例。
如何正确验证它?
我从数据库中检索数据与拉姆达像如何验证是否拉姆达查询返回null
var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn;
其实,在MyTable
,有2个没有ID。
所以我收到了这条消息。
未将对象引用设置为对象的实例。
如何正确验证它?
刚刚捕获查询的结果为独立的变量,并检查是否有任何项目访问其属性之前发现:
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();
你必须先检查返回值是零,然后访问:
var temp = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (temp != null)
{
var obj = temp.MyColumn;
}
不是最优雅的方式,但我不知道任何其他。
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).ToArray()
if( yourItem.Length > 0)
//do stuff
我喜欢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。
希望它有帮助。
注意'string.Empty'作为“默认值”对象isn'不会有'MyColumn'属性。这种情况下的缺省值需要是'MyTable'表中表示的类型的对象。 –
另一种方法是使用"null-coalescing" ??
operator,如果第一个参数为null,将使用第二个参数。
var obj = (DBContext.MyTable.FirstOrDefault(x => x.ID == 2) ?? new MyTable()).MyColumn;
+ 1使用空合并运算符... –
使用'DefaultIfEmpty(defaultValue)'(如@Microtechie建议的)是一种更加优雅(易于理解)的方式来做同样的事情。有些地方'??'是非常有用的,但这不是其中之一。 –
嗨@MosheKatz在尝试我的答案之前,我尝试过'DefaultIfEmpty(defaultValue)',它不起作用? – Dannyh
问题解决!谢谢lazyberezovsky :) – zey
@zey我已经添加了一个选项 - 如果你只需要一个属性从你的对象,那么你可以在服务器端投影结果 –