如果Linq查询为Null则返回System.Int32.MinValue

时间:2015-11-11 15:38:21

标签: c# asp.net-mvc linq

我正在尝试对字段执行LINQ查询以确定最大数字而不是添加一个。但是,如果表中没有任何内容,那么它就会崩溃。我尝试了两种不同的方法来解决这个问题:

int? tn = db.Tickets.Max(t => t.TicketNumber);
if (tn == null)
{
     ticket.TicketNumber = db.Tickets.Max(t => t.TicketNumber) + 1;
}
     else
{
     ticket.TicketNumber = System.Int32.MinValue + 1;
}

ticket.TicketNumber = db.Tickets.Max(t => t.TicketNumber) + 1 ?? System.Int32.MinValue + 1;

我尝试了其他几种方法,但它们都是对这两种方法的微小改动。我收到的错误是:

  

结果类型的泛型参数或查询必须使用可空类型。

我错过了什么?

5 个答案:

答案 0 :(得分:2)

您无法添加1null。尝试:

ticket.TicketNumber = (db.Tickets.Max(t => t.TicketNumber) ?? Int32.MinValue) + 1;

<强>更新

只有在涉及可空的情况下,才能使用??。在这里看来,除了null之外,你总是会得到某些值。你可能会尝试类似的东西:

var maxTicketNumber = db.Tickets.Max(t => t.TicketNumber);
ticket.TicketNumber = maxTicketNumber == default(int) ? Int32.MinValue : maxTicketNumber;

如果没有提供实际值(0),那只会将数据库中的数字与int的默认值进行比较。这基本上是你得到的而不是null,因为该属性不可为空。但是,0可能是完全有效的值,在这种情况下,您不希望使用此代码。这实际上取决于你实际想要实现的目标。也许如果您在问题中提供更多信息,我们将能够更好地为您提供帮助。

答案 1 :(得分:2)

怎么样

ticket.TicketNumber = db.Tickets.Max(t => (int?)t.TicketNumber).GetValueOrDefault(int.MinValue) + 1;

注意int?演员表,如果你没有表达,如果表格不包含记录,你将得到相同的例外。顺便说一句,完整的异常消息是

  

转换为值类型'System.Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。

答案 2 :(得分:1)

int? tn = db.Tickets.Max(t => (int?) t.TicketNumber).GetValueOrDefault(int.MinValue) + 1;

                              ^^^^^^

Enumerable.Max(IEnumerable<int>)重载不允许空枚举,因为它返回int,但不能保留nullEnumerable.Max(IEnumerable<int?>)重载确实允许空的枚举。

请注意,从int.MinValue + 1开始并不常见 - 你是否想要0而不是int.MinValue

答案 3 :(得分:1)

您可以使用page,只需在{}之前选择PHPMailer

TicketNumber

ticket.TicketNumber = db.Tickets .Select(t => t.TicketNumber) .DefaultIfEmpty(Int32.MinValue) .Max() + 1; 与自定义后备值一起使用会阻止DefaultIfEmpty处的异常,因为序列永远不会为空。

答案 4 :(得分:0)

如果你使用Entity Framework作为你的后端,这个Linq语句(虽然它看起来像一个坚果上的大锤)应该转换为一个相当有效的SQL查询:

ticket.TicketNumber = db.Tickets.OrderByDescending(t => t.TicketNumber).FirstOrDefault() + 1;

FirstOrDefault的使用意味着当没有现有条目时您实际上为零(您的TicketNumber字段不可为空,默认为0),但是当我在评论中说,这意味着您的第一个票号是1,这似乎是int.MinValue + 1的更现实的价值。