无法将Nullable <int64>分配给Linq.Table.Max()?</int64>

时间:2011-10-10 15:54:43

标签: c# linq linq-to-sql nullable

我的程序中有以下两行代码。目标是从“值”字段返回最高数字。

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

“值”字段是表中的bigint字段。该表也不能保证它包含行,实际上它是我现在正在测试的场景。我试图在MyTable没有行时运行它。

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

  

无法将null值分配给System.Int64类型的成员,该类型是不可为空的值类型。

我尝试了几种不同的方法,但我无法让它发挥作用。我显然不理解C#中可空类型的重要内容。

编辑(解决方案):

感谢Chris的回答,我能够找到问题和解决方案的实际原因。事实证明,Value字段不是那么多,而是因为lambda表达式中的x是一个空行。所以我在lambda中添加了一个检查,看看x是否为null,如果没有,那么我可以安全地检查Value是否为null。

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

1 个答案:

答案 0 :(得分:3)

您的最大功能是尝试返回Int64。您正在使用的Max的重载在MSDN上定义。你会看到它需要一个参数Func<TSource, long> selector。这是你的lambda表达式,并表示你将给它一个TSource,它将返回一个long(即Int64)。你的函数正在做的是当x.Value为null时返回一个空值,当然这对于Int64来说无效。

在这种情况下,你应该可以使用类似的东西:

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

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

我应该否认这段代码未经测试,但应该给你正确的想法。

编辑:我原本假设这是一个可以为空的长,但事实证明有重载支持,所以我现在假设x不是可以长的,只是看起来有点像一个如果你正确地眯着眼睛。

相关问题