【问题标题】:How to check if ObjectResult collection was empty?如何检查 ObjectResult 集合是否为空?
【发布时间】:2012-06-24 13:15:44
【问题描述】:

我有这段代码可以检查数据库中的最后一个 customer_id。

ObjectResult<int?> last_customer_id_collection = MainForm.eggsContext.ExecuteStoreQuery<int?>("select MAX(customer_id) from customers");

然后我得到像这样需要的下一个 id

new_customer_id = last_customer_id_collection.FirstOrDefault<int?>().Value + 1;

它工作正常,但是在处理新的空数据库时,声明 last_customer_id_collection.FirstOrDefault&lt;int?&gt;() 会引发 InvalidOperationException。

如何在不尝试捕获的情况下检查 last_customer_id_collection 是否为空?

(p.s. 我试图检查 last_customer_id_collection.Any&lt;int?&gt;()last_customer_id_collection.Count&lt;int?&gt;() 或 DefaultIfEmpty 等,但我尝试的一切都会导致此异常)

【问题讨论】:

  • 异常信息是什么?
  • 为什么要加入&lt;int?&gt;?该集合实际上是int?int 类型还是其他类型?我怀疑这可能是您问题的根源。
  • 您能发布 Stacktrace 和/或异常消息吗?所以我们可以确切地看到这里发生了什么。可能是您的数据库连接导致了InvalidOperationException,因为对数据库的实际调用被推迟到您调用FirstOrDefault

标签: c# collections ienumerable nullable executestorequery


【解决方案1】:

您会收到 InvalidOperationException,因为 Nullable&lt;T&gt;.HasValue 会返回 false。

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

var custId = last_customer_id_collection.FirstOrDefault<int?>();
if(custId.HasValue)
    DoStuffWithId();
else
    DoStuffWithNullResult();

演示 Nullable 的潜在混淆行为的小示例 这将打印:

“Null!”、“No Value but no NullReferenceException”然后是“糟糕,InvalidOperationException”

List<int?> values = new List<int?>();

var test = values.FirstOrDefault();

if (test == null)
    Console.WriteLine("Null!");

if (test.HasValue)
    Console.WriteLine(test.Value);
else
    Console.WriteLine("No Value but no NullReferenceException");

try
{
    int value = test.Value;
}
catch(InvalidOperationException)
{
    Console.WriteLine("Oops, InvalidOperationException");
}

【讨论】:

  • 你的答案和迈克尔斯到底有什么区别?这似乎不是这里的问题,因为它会抛出 NullReferenceException,而不是 InvalidOperationException。编辑:迈克尔刚刚删除了他的答案......
  • 不,它不会抛出 NullReferenceException,因为他使用的是 int?
  • 你的权利,刚刚检查过:(new int?[] { null, 2, 3 }).FirstOrDefault().Value; 确实抛出了InvalidOperationException。不知道。为你 +1 :)
  • 添加了一个小示例,演示如何获得 InvalidOperationException 但没有 NullReferenceException,以及如何在测试为 true 的变量上调用 HasValue 以进行空检查。
  • 你是个天才。但是我仍然不明白为什么在调试和尝试从监视窗口评估 last_customer_id_collection.FirstOrDefault() 时它会给出 InvalidOperatationException,但从代码 var custId = last_customer_id_collection.FirstOrDefault&lt;int?&gt;() 它不会抛出那个异常??跨度>
猜你喜欢
  • 2017-05-07
  • 2018-08-09
  • 2011-04-24
  • 2016-06-20
  • 2017-05-28
  • 2016-03-28
  • 2010-11-09
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多