我正在尝试对字段执行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;
我尝试了其他几种方法,但它们都是对这两种方法的微小改动。我收到的错误是:
结果类型的泛型参数或查询必须使用可空类型。
我错过了什么?
答案 0 :(得分:2)
您无法添加1
和null
。尝试:
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
,但不能保留null
。 Enumerable.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
的更现实的价值。