1

我有这段代码可以检查数据库中的最后一个 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<int?>()会引发 InvalidOperationException。

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

(ps 我试图检查 iflast_customer_id_collection.Any<int?>()last_customer_id_collection.Count<int?>()DefaultIfEmpty 等,但我尝试的一切都会导致此异常)

4

1 回答 1

1

你得到一个 InvalidOperationException 因为Nullable<T>.HasValue会返回 false。

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

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

演示 Nullables 可能令人困惑的行为的小示例 这将打印:

“空!”、“没有值但没有 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");
}
于 2012-06-24T13:29:21.407 回答