Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何验证lambda查询是否返回null_C#_Linq_Lambda - Fatal编程技术网

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

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

我使用lambda-like从数据库中检索数据

 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;