C# 如何检查ObjectResult集合是否为空?
我有一段代码,用于检查数据库中最后一个客户idC# 如何检查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
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;
但是,在处理新的空数据库时,stationlast\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()
中,它不会引发该异常??