C# 如何检查ObjectResult集合是否为空?

C# 如何检查ObjectResult集合是否为空?,c#,collections,ienumerable,nullable,executestorequery,C#,Collections,Ienumerable,Nullable,Executestorequery,我有一段代码,用于检查数据库中最后一个客户id ObjectResult<int?> last_customer_id_collection = MainForm.eggsContext.ExecuteStoreQuery<int?>("select MAX(customer_id) from customers"); ObjectResult last\u customer\u id\u collection=MainForm.eggsContext.ExecuteS

我有一段代码,用于检查数据库中最后一个客户id

ObjectResult<int?> last_customer_id_collection = MainForm.eggsContext.ExecuteStoreQuery<int?>("select MAX(customer_id) from customers");
ObjectResult last\u customer\u id\u collection=MainForm.eggsContext.ExecuteStoreQuery(“从客户中选择MAX(客户id));
然后我得到下一个像这样的身份证

new_customer_id = last_customer_id_collection.FirstOrDefault<int?>().Value + 1;
new\u customer\u id=last\u customer\u id\u collection.FirstOrDefault().Value+1;
但是,在处理新的空数据库时,station
last\u customer\u id\u collection.FirstOrDefault()
会抛出InvalidOperationException

如何在没有try catch的情况下检查上一个客户id集合是否为空


(另一方面,我试图检查是否
last\u customer\u id\u collection.Any()
last\u customer\u id\u collection.Count()
或DefaultIfEmpty等。但我尝试的所有操作都会导致此异常)

您会得到一个InvalidOperationException,因为
null.HasValue
将返回false

如果查询返回值为空,则需要修改代码以不调用
.Value

var custId = last_customer_id_collection.FirstOrDefault<int?>();
if(custId.HasValue)
    DoStuffWithId();
else
    DoStuffWithNullResult();
var custId=last\u customer\u id\u collection.FirstOrDefault();
if(custId.HasValue)
dostuffithId();
其他的
DoStuffWithNullResult();
演示Nullables的潜在混淆行为的小示例 这将打印:

“Null!”,“无值但无NullReferenceException”,然后是“Oops,InvalidOperationException”

列表值=新列表();
var test=values.FirstOrDefault();
if(test==null)
Console.WriteLine(“Null!”);
if(test.HasValue)
控制台写入线(测试值);
其他的
WriteLine(“无值但无NullReferenceException”);
尝试
{
int值=测试值;
}
捕获(无效操作异常)
{
Console.WriteLine(“Oops,无效操作异常”);
}

您将获得InvalidOperationException,因为
Nullable.HasValue
将返回false

如果查询返回值为空,则需要修改代码以不调用
.Value

var custId = last_customer_id_collection.FirstOrDefault<int?>();
if(custId.HasValue)
    DoStuffWithId();
else
    DoStuffWithNullResult();
var custId=last\u customer\u id\u collection.FirstOrDefault();
if(custId.HasValue)
dostuffithId();
其他的
DoStuffWithNullResult();
演示Nullables的潜在混淆行为的小示例 这将打印:

“Null!”,“无值但无NullReferenceException”,然后是“Oops,InvalidOperationException”

列表值=新列表();
var test=values.FirstOrDefault();
if(test==null)
Console.WriteLine(“Null!”);
if(test.HasValue)
控制台写入线(测试值);
其他的
WriteLine(“无值但无NullReferenceException”);
尝试
{
int值=测试值;
}
捕获(无效操作异常)
{
Console.WriteLine(“Oops,无效操作异常”);
}

什么是异常消息?为什么要包括
?集合的类型实际上是
int?
int
还是其他类型?我怀疑这可能是你问题的根源。你能发布Stacktrace和/或异常消息吗?所以我们可以看到这里到底发生了什么。可能是您的数据库连接导致了
InvalidOperationException
,因为对数据库的实际调用被推迟到您调用
FirstOrDefault
。异常消息是什么?为什么要包括
?集合的类型实际上是
int?
int
还是其他类型?我怀疑这可能是你问题的根源。你能发布Stacktrace和/或异常消息吗?所以我们可以看到这里到底发生了什么。可能是您的数据库连接导致了
invalidoOperationException
,因为对数据库的实际调用被推迟到您调用
FirstOrDefault
。您的答案与Michaels的答案有什么区别?这似乎不是这里的问题,因为它会引发NullReferenceException,而不是InvalidOperationException。编辑:Michael刚刚删除了他的答案…不,它不会抛出NullReferenceException,因为他正在使用int?您的权利,只是检查了它:
(新int?[{null,2,3})
确实会抛出一个
InvalidOperationException
。我不知道+1为您:)添加了一个小示例,演示如何获取InvalidOperationException但不获取NullReferenceException,以及如何对测试为true的变量调用HasValue以进行null检查。您是个天才。但我仍然无法理解为什么在调试和尝试评估last_customer_id_collection.FirstOrDefault()时,它会从监视窗口中给出InvalidOpertationException,但从代码
var custId=last_customer_id_collection.FirstOrDefault()中
它不会抛出该异常??您的答案与Michaels的答案之间到底有什么区别?这似乎不是这里的问题,因为它会引发NullReferenceException,而不是InvalidOperationException。编辑:Michael刚刚删除了他的答案…不,它不会抛出NullReferenceException,因为他正在使用int?您的权利,只是检查了它:
(新int?[{null,2,3})
确实会抛出一个
InvalidOperationException
。我不知道+1为您:)添加了一个小示例,演示如何获取InvalidOperationException但不获取NullReferenceException,以及如何对测试为true的变量调用HasValue以进行null检查。您是个天才。但我仍然不明白为什么在调试和尝试评估last_customer_id_collection.FirstOrDefault()时,从“监视”窗口中,它会给出InvalidAttactionException,但从代码
var custId=last_customer_id_collection.FirstOrDefault()
中,它不会引发该异常??