C# 如何验证lambda查询是否返回null
我使用lambda-like从数据库中检索数据C# 如何验证lambda查询是否返回null,c#,linq,lambda,C#,Linq,Lambda,我使用lambda-like从数据库中检索数据 var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn; 实际上,在MyTable中,没有带2的ID。 所以我得到了这个信息 对象引用未设置为对象的实例 如何正确验证它?只需将查询结果捕获到单独的变量中,并在访问其属性之前检查是否找到任何项: var yourItem = DBContext.MyTable.Where(x => x.I
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;
顺便说一句,您可以将谓词传递到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();
您必须首先检查返回值是否为null,然后访问它:
var temp = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (temp != null)
{
var obj = temp.MyColumn;
}
这不是最优雅的方式,但我不知道其他方式。我更喜欢DefaultIfEmpty()而不是.FirstOrDefault()
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).ToArray()
if( yourItem.Length > 0)
//do stuff
通过这样做,我们可以避免
比如说
var obj = DBContext.MyTable.Where(x => x.ID == 2).DefaultIfEmpty().MyColumn;
或
DefaultIfEmpty的概念很简单:它用一个默认值的集合替换一个空集合
int的默认值是0。因此,列表上的DefaultIfEmpty生成一个包含一个零元素的列表
希望有帮助。另一种方法是使用,如果第一个参数为空,则将使用第二个参数
var obj=(DBContext.MyTable.FirstOrDefault(x=>x.ID==2)??new MyTable()).MyColumn
@zey我又添加了一个选项-如果您只需要对象的一个属性,那么您可以使用DefaultIfEmpty(defaultValue)
(正如@Microtechie所建议的)在服务器端投影结果,这是一种更优雅(且易于阅读)的方法。有些地方,??
非常有用,但这并不是其中之一。嗨@MosheKatz我在尝试我的答案之前尝试了DefaultIfEmpty(defaultValue)
,但没有成功?@user2893091你把什么作为defaultValue
?在您的示例中,它应该是DefaultIfEmpty(new MyTable())
。请注意,作为“默认值”对象的string.Empty
不会有MyColumn
属性。这种情况下的默认值需要是MyTable
表中表示的类型的对象。
var obj = DBContext.MyTable.Where(x => x.ID == 2).DefaultIfEmpty(string.Empty).MyColumn;