不能赋值NullableLinq.Table.Max()

本文关键字:Table Max Linq 赋值 Nullable Int64 不能 | 更新日期: 2023-09-27 18:10:48

我的程序中有以下两行代码。目标是从Value字段返回最大的数字。

MyDataContext context = new MyDataContext();
long? id = (long?)context.MyTable.Max(x => x.Value);

Value字段是表中的bigint字段。表也不能保证它包含行,事实上,这是我现在测试的场景。当MyTable没有行时,我试图运行这个。

第二行返回无效操作异常。

不能将空值赋给System类型的成员。Int64,这是一个非空值类型。

我已经尝试了几种不同的方法,但我无法得到这个工作。我显然不理解c#中可空类型的一些重要内容。

编辑(解决方案):

多亏了Chris的回答,我才能找到问题的真正原因和解决方案。结果不是Value字段为空而是因为表达式中的x是空行。因此,我在lambda中添加了一个检查来查看x是否为空,如果不是,那么我可以安全地检查Value是否为空。

MyDataContext context = new MyDataContext();
long? id = context.MyTable.Max(x => x == null ? (long?)0 : (long?)x.Value);

不能赋值Nullable<Int64>Linq.Table.Max()

max函数试图返回Int64。您正在使用的最大过载是在MSDN上定义的。你会看到它有一个参数Func<TSource, long> selector。这是你的lambda表达式,并说你将给它一个TSource,它将返回一个long(即Int64)。你的函数正在做的是当x.Value为空返回一个空值,这当然是无效的作为Int64。

在这种情况下,你应该能够使用这样的东西:

x=> x.Value!=null?x.Value:Int64.Minvalue

这意味着如果x有一个值,它返回该值,否则返回最小可能值,该值只有在所有为空时才会是最大值。

我不应该说这段代码是未经测试的,但应该给你一个正确的想法。

edited:我最初假设这是一个可空的long,但事实证明有重载支持,所以我现在假设x不是一个可空的long,只是看起来有点像,如果你斜视int正确的方式